1. 背景
栈应该是第一次出现一个很专业名词的数据结构了吧,但是栈依然是一个非常简单一维结构。
之所以称之为栈,就是因为栈的特点是后进先出,就像一个货栈,先放进去东西总是放在里面,后放进去的东西放到门口,所以往外拿出来的时候,就先拿出来门口的。
2. 顺序栈
我们把线性表看为从上到下的一个一维结构,不管是往线性表里添加元素还是取出元素,都是在上部(顶部)操作,不就是后进先出了吗。
所以栈其实就是在一维线性表顶部(最后面)进行添加或者取出的集合。
栈可以使用数组或者链表作为存储结构,当使用数组时为顺序栈,使用链表时为链栈。
3. 栈的操作
入栈,将一个元素放入栈中
出栈,将栈顶元素拿出来
其他操作实际上都是以这几个操作为基础实现的。
4. 顺序栈的代码实现
/* * 顺序栈的实现 * 作者:熊猫大大 * 时间:2019-09-28 */ #include<stdio.h> #define STACK_LENGTH 10 //定义结构体保存栈信息 struct Stack { //栈元素 int element[STACK_LENGTH]; //栈顶位置 top==0表示元素为空 top==x表示有x个元素且栈顶元素在element[x-1]处 int top; }; //展示栈内所有元素(方便测试),从栈顶到栈底的顺序展示即可 void printStack(struct Stack *p) { int i; printf("==================当前栈内元素如下\n"); for (i = p->top - 1; i >= 0; i--) { printf("%d ", p->element[i]); } printf("\n==================\n"); } //入栈 int stackIn(struct Stack *p, int num) { if (p->top>STACK_LENGTH - 1)//栈满了 return 0;//入栈失败 p->element[p->top] = num; p->top++; return 1;//入栈成功 } //出栈,以返回值的形式提供出栈元素的值 int stackOut(struct Stack *p, int *result) { if (p->top <= 0)//空栈 return 0; //取栈顶元素 *result = p->element[p->top - 1]; //栈顶元素出栈 p->top--; return 1; } //入口 int main() { //初始化 struct Stack stack; stack.top = 0; printStack(&stack); //入栈 stackIn(&stack, 1); stackIn(&stack, 2); stackIn(&stack, 3); stackIn(&stack, 7); stackIn(&stack, 8); stackIn(&stack, 9); //输出 printStack(&stack); //出栈 int result; stackOut(&stack, &result); printf("OUT:%d\n", result); stackOut(&stack, &result); printf("OUT:%d\n", result); stackOut(&stack, &result); printf("OUT:%d\n", result); printStack(&stack); stackOut(&stack, &result); printf("OUT:%d\n", result); stackOut(&stack, &result); printf("OUT:%d\n", result); stackOut(&stack, &result); printf("OUT:%d\n", result); printStack(&stack); return 1; }