栈(上)
栈是线性表中一种特殊的数据结构,拥有先进后出,后进先出的特点,简称LIFO(Last In First Out)。
ADT Stack{
>数据对象:D={ai|ai∈ElemSet,i=1,2,...,n,n≧0}> > 数 据 对 象 : D = { a i | a i ∈ E l e m S e t , i = 1 , 2 , . . . , n , n ≧ 0 } >
>数据关系:Rl={<ai−1,ai|ai−1,ai∈D,i=2,3,...,n}> > 数 据 关 系 : R l = { < a i − 1 , a i | a i − 1 , a i ∈ D , i = 2 , 3 , . . . , n } >
>基本操作:入栈,出栈> > 基 本 操 作 : 入 栈 , 出 栈 >}
1、栈——静态存储
1.1类型定义及说明
#include "stdafx.h"
#define MAX_STACK_SIZE 100
#define OK 1
#define ERROR -1
typedef int SElemType;
typedef int status;
1.2存储方式
用一个一维数组来存放栈的元素,这是最简单的存储方式,但这种方式无法在重新分配内存,所以一开始根据需要选择合适的大小。
1.2.1静态栈的定义
typedef struct { SElemType stack_array[MAX_STACK_SIZE];/*将栈的元素存在数组中*/ int top;//定义一个数组下标 }SStack;/*定义一个栈的数据结构*/
1.2.2栈的初始化
status Init_stack(SStack &S) { S.top = 0; return OK; }/*栈的初始化*/
1.2.3圧栈
status Push(SStack &S, SElemType e) { if (S.top == MAX_STACK_SIZE - 1)return ERROR;/*栈满,返回错误*/ S.top++; S.stack_array[S.top] = e;/*栈顶插入元素,即圧栈*/ return OK; }/*圧栈*/
1.2.4出栈
status Pop(SStack &S, SElemType &e) { if (S.top == 0)return ERROR;/*栈空,返回错误*/ e = S.stack_array[S.top];/*将栈顶元素返回*/ S.top--; return OK; }
1.2.5遍历
void Travel(SStack S) { for (int i = 1; i <= S.top; i++) { printf("第%d个数据%d:\r\n", i, S.stack_array[i]); } }/*遍历栈*/
1.3附:主函数
int main()
{
int i=1;
int e;
SStack S;
Init_stack(S);
printf("输入第%d个元素:\n",i);
scanf("%d", &e);
while (e != 32767)
{
Push(S, e);
i++;
printf("输入第%d个元素:\n", i);
scanf("%d", &e);
}
Travel(S);
Pop(S, e);
printf("栈顶元素出栈:%d\n", e);
return 0;
}
说明
栈的静态存储最简单,使用起来很方便,但由于内存固定的限制,下一节的动态存储更加适合。