3.1 栈—栈的存储实现和运算实现
由于栈是运算受限的线性表,因此线性表的存储结构对栈也是适用的,只是操作不同而已。
定义一个指向顺序栈的指针:
图(a)是空栈,图(c)是A、B、C、D、E 5 个元素依次入栈之后,图(d)是在图(c)之后E、D 相继出栈,此时栈中还有3 个元素,或许最近出栈的元素D、E 仍然在原先的单元存储着,但top 指针已经指向了新的栈顶,则元素D、E 已不在栈中了,通过这个示意图要深刻理解栈顶指针的作用。
在上述存储结构上基本操作的实现如下:
⑴ 置空栈:首先建立栈空间,然后初始化栈顶指针。
⑵ 判空栈
⑶ 入栈
⑷ 出栈
⑸ 取栈顶元素
以下几点说明:
1. 对于顺序栈,入栈时,首先判栈是否满了,栈满的条件为:s->top==MAXSIZE-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。
2. 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空时常作为一种控制转移的条件。
1. 顺序栈
利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,栈中的数据元素用一个预设的足够长度的一维数组来实现:datatype data[MAXSIZE],栈底位置可以设置在数组的任一个端点,而栈顶是随着插入和删除而变化的,用一个int top 来作为栈顶的指针,指明当前栈顶的位置,同样将data 和top 封装在一个结构中,顺序栈的类型描述如下:1 #define MAXSIZE 1024 2 typedef struct 3 { 4 datatype data[MAXSIZE]; 5 int top; 6 }SeqStack;
SeqStack *s;
通常0 下标端设为栈底,这样空栈时栈顶指针top=-1; 入栈时,栈顶指针加1,即s->top++; 出栈时,栈顶指针减1,即s->top--。栈操作的示意图如图3.2 所示。图(a)是空栈,图(c)是A、B、C、D、E 5 个元素依次入栈之后,图(d)是在图(c)之后E、D 相继出栈,此时栈中还有3 个元素,或许最近出栈的元素D、E 仍然在原先的单元存储着,但top 指针已经指向了新的栈顶,则元素D、E 已不在栈中了,通过这个示意图要深刻理解栈顶指针的作用。
在上述存储结构上基本操作的实现如下:
⑴ 置空栈:首先建立栈空间,然后初始化栈顶指针。
1 SeqStack *Init_SeqStack() 2 { 3 SeqStack *s; 4 s=malloc(sizeof(SeqStack)); 5 s->top= -1; 6 return s; 7 }
1 int Empty_SeqStack(SeqStack *s) 2 { 3 if (s->top== -1) 4 return 1; 5 else 6 return 0; 7 }
1 int Push_SeqStack (SeqStack *s, datatype x) 2 { 3 if (s->top==MAXSIZE-1) /*栈满不能入栈*/ 4 return 0; 5 else 6 { 7 s->top++; 8 s->data[s->top]=x; 9 return 1; 10 } 11 }
1 int Pop_SeqStack(SeqStack *s, datatype *x) 2 { 3 if (Empty_SeqStack ( s ) ) /*栈空不能出栈*/ 4 return 0; 5 else /*栈顶元素存入*x,返回*/ 6 { 7 *x=s->data[s->top]; 8 s->top--; 9 return 1; 10 } 11 }
1 datatype Top_SeqStack(SeqStack *s) 2 { 3 if ( Empty_SeqStack ( s ) ) /*栈空*/ 4 return 0; 5 else 6 return (s->data[s->top]); 7 }
1. 对于顺序栈,入栈时,首先判栈是否满了,栈满的条件为:s->top==MAXSIZE-1,栈满时,不能入栈; 否则出现空间溢出,引起错误,这种现象称为上溢。
2. 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空时常作为一种控制转移的条件。
2. 链栈
用链式存储结构实现的栈称为链栈。通常链栈用单链表表示,因此其结点结构与单链表的结构相同,在此用LinkStack 表示,即有:1 typedef struct node 2 { 3 datatype data; 4 struct node *next; 5 }StackNode,*LinkStack;
链栈基本操作的实现如下:
⑴ 置空栈
1 LinkStack Init_LinkStack() 2 { 3 return NULL; 4 }
1 int Empty_LinkStack(LinkStack top ) 2 { 3 if(top==-1) 4 return 1; 5 else 6 return 0; 7 }
1 LinkStack Push_LinkStack(LinkStack top, datatype x) 2 { 3 StackNode *s; 4 s=malloc(sizeof(StackNode)); 5 s->data=x; 6 s->next=top; 7 top=s; 8 return top; 9 }
1 LinkStack Pop_LinkStack (LinkStack top, datatype *x) 2 { 3 StackNode *p; 4 if (top==NULL) 5 return NULL; 6 else 7 { 8 *x = top->data; 9 p = top; 10 top = top->next; 11 free (p); 12 return top; 13 } 14 }
posted on 2015-04-20 09:49 chunlanse2014 阅读(875) 评论(0) 编辑 收藏 举报