如果是创建链栈呢
时间: 2024-02-12 16:02:37 浏览: 24
链栈是使用链表来实现栈的一种数据结构,相比使用数组的顺序栈,链栈的空间利用更加灵活。以下是一个简单的链栈实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点
typedef struct ListNode {
int data;
struct ListNode *next;
} ListNode;
// 定义链栈结构
typedef struct {
ListNode *top; // 栈顶指针
int size; // 栈的大小
} Stack;
// 初始化链栈
void initStack(Stack *s) {
s->top = NULL;
s->size = 0;
}
// 判断链栈是否为空
int isEmpty(Stack *s) {
return s->top == NULL;
}
// 入栈
void push(Stack *s, int item) {
ListNode *newNode = (ListNode*)malloc(sizeof(ListNode));
newNode->data = item;
newNode->next = s->top;
s->top = newNode;
s->size++;
}
// 出栈
int pop(Stack *s) {
if (isEmpty(s)) {
printf("Stack underflow!\n");
return -1;
}
ListNode *temp = s->top;
int item = temp->data;
s->top = s->top->next;
free(temp);
s->size--;
return item;
}
// 获取栈顶元素
int peek(Stack *s) {
if (isEmpty(s)) {
printf("Stack is empty!\n");
return -1;
}
return s->top->data;
}
int main() {
Stack s;
initStack(&s);
push(&s, 1);
push(&s, 2);
push(&s, 3);
printf("Top element: %d\n", peek(&s));
pop(&s);
printf("Top element: %d\n", peek(&s));
pop(&s);
printf("Top element: %d\n", peek(&s));
pop(&s);
printf("Is stack empty? %d\n", isEmpty(&s));
return 0;
}
```
这个链栈实现使用了一个结构体,包含一个指向链表头部的指针和栈的大小。具体的链栈操作包括初始化链栈、判断链栈是否为空、入栈、出栈和获取栈顶元素。在入栈操作中,我们使用动态内存分配来创建新的链表节点,并将其插入到链表的头部。在出栈操作中,我们需要释放被弹出的节点的内存空间。在主函数中,我们可以看到链栈的基本操作过程。