栈
1.栈的定义与基本操作
栈(stack)是一种仅允许在一端插入和删除运算的线性表。栈中允许进行插入和删除的一端,称为栈顶(top)。栈顶的第一个元素称为栈顶元素。栈中不可以插入和删除的那一端,称为栈底(bottom)。在一个栈中插入新元素,即把新元素放到当前栈顶元素的上面,使其成为新的栈顶元素,这一操作称为进栈,入栈或压栈(push)。从一个栈中删除一个元素,把栈顶元素删除掉,使其下面的元素成为新的栈顶元素,称为出栈或退栈(pop)。
注意:插入或删除都只能在栈顶一端进行。由于栈的插入或删除只能在栈顶一端进行,后进本栈的元素必定先出栈,所以栈又称为后进先出的线性表(last in first out)(简称LIFO结构)
2.栈的基本操作
定义在栈上的基本操作有如下几种。
- 1) InitStack(s):构造出一个空栈S。
- 2) ClearStack(s):清除栈S中的所有元素。
- 3) StackEmpty(s):判断栈S是否为空。
- 4) GetTop(s):返回S的栈顶元素,但不能移动栈顶指针。
- 5) Push(s,x):插入元素x 为新的栈顶元素。
- 6) Pop(s) :删除s 的栈顶元素并返回其值。
由于栈是运算受限制的线性表,因此线性表的存储结构对于栈来说也同样适用。即栈的存储构也难为顺序存储和链式存储,也称为顺序栈和链式栈。
3.1.2顺序栈的存储结构和操作的实现
1.顺序栈的存储存储结构的定义
顺序栈,即是利用一组连续的存储单元依次存放从栈底到栈顶的数据元素,我们用一个数组描述顺序栈中数据元素的相信区域,并预先设计数组的最大存储空间。用一个整型变量top来指示栈顶的位置,通常称为栈顶指针。因此,顺序栈的存储结构的描述如下:
#define Maxsize 100 /*设顺序表的最大长度为100,可依具体情况分配空间*/ typedef int datatype; typedef struct { datatype stack[Maxsize]; int top;/*栈顶指针*/ }SeqStack;//顺序栈类型定义 |
由于c语言中数组的下标从0开始。即s->stack[0]是栈底元素,而栈底指针s->top 是正向增
长的,即进栈是需将s->top加1,退栈时s->top减1 ,因此当S->top=--1(或<0)表示栈空,S->top=Maxsize-1表示栈满。
2.顺序栈的基本操作
在进行入栈操作之前,首先判断栈是否已满,在进行出栈之前先判断栈是否为空。
- (1) 构造一个空栈
//构造一个空栈 SeqStack *InitStack() { SeqStack *s;/* s为顺序栈类型变量的指针*/ s=(SeqStack *)malloc(sizeof(SeqStack)); if(!s) { printf("空间不足/n"); return NULL; } else { s->top=-1; return s; } } |
- (2) 取栈顶元素
//取栈顶元素 datatype GetTop(SeqStack *s) { if(s->top == -1) { printf("/n栈是空的!"); return 0; } else return s->stack[s->top];
} |
- (3) 入栈
//入栈
SeqStack *Push(SeqStack *s,datatype x) { if(s->top == Maxsize-1 ) { printf("/n栈是满的!"); return NULL; } else { s->top++; s->stack[s->top]=x; return s; } } |
- (4) 出栈
//出栈 datatype Pop(SeqStack *s) { if(s->top == -1) { printf("/n栈已经空了!"); return 0; } s->top--; return s->stack[s->top+1]; } |
- (5) 判断空栈
//判别空栈 datatype SeqStackEmpty(SeqStack *s) { if(s->top ==-1) { printf("此栈是空栈!"); return 1; } else { printf("此栈不是空栈!"); return 0; } } |
(6) 循环遍历栈
void display(SeqStack *p) { int t ; t = p->top; if(p->top==-1) { printf("/n此栈是空的"); } else while(t!=-1) { printf("%d->",p->stack[t]); t--; } } |
(7)main函数来测试上面的各种操作
main() { int arr[8]={1,2,3,4,5,6,7,8},i; SeqStack *p; p=InitStack();
//入栈
for(i=0;i<8;i++) Push(p,arr[i]);
//遍历栈
printf("新栈的元素是: "); display(p); printf("/n");
//得栈顶元素 printf("栈顶元素是: "); printf("%d",GetTop(p)); printf("/n");
//判别空栈 printf("判断是否为空栈?: "); SeqStackEmpty(p); printf("/n");
//出栈 printf("出栈元素:"); printf("%d",Pop(p)); printf("/n");
//出栈后的栈里元素是: printf("出栈后的栈里元素是: "); display(p); printf("/n"); } |
可在以下网址下载源程序
http://lijingronghcit.download.csdn.net/user/lijingronghcit/all/1