1.栈的定义
栈只能从表的一端存取数据,另一端是封闭的,如图所示;在栈中,无论是存数据还是取数据,都必须遵循"先进后出"的原则,即最先进栈的元素最后出栈。拿下图的栈来说,1是最先进的栈。因此,当需要从栈中取出1 时,根据"先进后出"的原则,需提前将3和2从栈中取出,然后才能成功取出1。
栈的头端被称为栈顶;封口端被称为栈底
2.栈的类型
- 顺序栈:采用顺序存储结构可以模拟栈存储数据实现栈存储结构,底层为数组
- 链式栈:采用链式存储结构可以模拟栈存储数据实现栈存储结构,底层为链表
3.算法
在实际应用中,通常只会对栈执行以下两种操作:
- 入栈:向栈中添加元素
- 出栈:从栈中提取出指定元素
4.顺序栈代码描述
代码基本简单
#include <stdio.h>
int push(int* a,int top,int elem){
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;
}
int main() {
int a[100];
int top=-1;
top=push(a, top, 1);
top=push(a, top, 2);
top=push(a, top, 3);
top=push(a, top, 4);
top=pop(a, top);
top=pop(a, top);
top=pop(a, top);
top=pop(a, top);
top=pop(a, top);
return 0;
}
5.链式栈代码描述
- 入栈:头插法向链表中插入元素,例如将元素1,2,3,4依次入栈
- 出栈:删除链表首元结点,先进后出
完整代码为:
#include <stdio.h>
#include <stdlib.h>
typedef struct stack
{
int iVal;
struct stack* ptNext;
}T_Stack,*PT_Stack;
//画图
PT_Stack push(PT_Stack ptStack, int iVal)
{
//分配新结点
PT_Stack ptNewNode = (PT_Stack)malloc(sizeof(T_Stack));
ptNewNode->iVal = iVal;
//头指针和新结点建立联系
ptNewNode->ptNext = ptStack;
/*更新头指针的位置*/
ptStack = ptNewNode;
return ptStack;
}
PT_Stack pop(PT_Stack ptStack)
{
if (ptStack)
{
PT_Stack ptDelNode = ptStack;
ptStack = ptStack->ptNext;
printf("出栈元素为%d\n", ptDelNode->iVal);
if (ptStack)
{
printf("新栈顶元素%d\n", ptStack->iVal);
}
else
{
printf("栈已空\n");
}
free(ptDelNode);
}
else
{
printf("栈已空");
}
return ptStack;
}
int main()
{
//头指针指向首元结点
PT_Stack ptStack = NULL;
/*入栈操作*/
ptStack = push(ptStack, 1);
ptStack = push(ptStack, 2);
ptStack = push(ptStack, 3);
ptStack = push(ptStack, 4);
/*出栈操作*/
ptStack = pop(ptStack);
ptStack = pop(ptStack);
ptStack = pop(ptStack);
ptStack = pop(ptStack);
return 0;
}
结果: