什么是栈?
栈是一种“特殊”的线性存储结构,它的特殊之处体现在以下两个地方:
- 元素进栈和出栈的操作只能从一端完成,另一端是封闭的
- 栈中无论存数据还是取数据,都必须遵循“先进后出”的原则,即最先入栈的元素最先出栈。
顺序栈元素"入栈"
//元素elem进栈,a为数组,top值为当前栈的栈顶位置
int push(int* a,int top,int elem){
a[++top]=elem;//等价于先执行 ++top,再执行 a[top]=elem。
return top;
}
顺序栈元素"出栈"
//数据元素出栈
int pop(int * a,int top){
if (top == -1) {
printf("空栈");
return -1;
}
printf("弹栈元素:%d\n",a[top]);
top--;
return top;
}
链栈基本操作
链栈的实现思路和顺序栈类似,顺序栈是将顺序表(数组)的一端做栈底,另一端做栈顶;链栈也是如此,我们通常将链表的头部做栈顶,尾部做栈底。
以链表的头部做栈顶,最大的好处是:可以避免在实现元素 "入栈" 和 "出栈" 时做大量遍历链表的耗时操作。
有元素入栈时,只需要将其插入到链表的头部;有元素出栈时,只需要从链表的头部依次摘取结点。
链栈元素入栈
//链表中的节点结构
typedef struct lineStack {
int data;
struct lineStack* next;
}LineStack;
//stack为当前的链栈,a表示入栈元素
LineStack* push(LineStack* stack, int a) {
//创建存储新元素的节点
LineStack* line = (LineStack*)malloc(sizeof(LineStack));
line->data = a;
//新节点与头节点建立逻辑关系
line->next = stack;
//更新头指针的指向
stack = line;
return stack;
}
链栈元素出栈
//栈顶元素出链栈的实现函数
LineStack* pop(LineStack* stack) {
if (stack) {
//声明一个新指针指向栈顶节点
LineStack* p = stack;
//更新头指针
stack = stack->next;
printf("出栈元素:%d ", p->data);
if (stack) {
printf("新栈顶元素:%d\n", stack->data);
}
else {
printf("栈已空\n");
}
free(p);
}
else {
printf("栈内没有元素");
return stack;
}
return stack;
}