chunlanse2014

导航

3.1 栈—栈的存储实现和运算实现

由于栈是运算受限的线性表,因此线性表的存储结构对栈也是适用的,只是操作不同而已。

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;
说明top 为栈顶指针: LinkStack top ;因为栈中的主要运算是在栈顶插入、删除,显然在链表的头部做栈顶是最方便的,而且没有必要象单链表那样为了运算方便附加一个头结点。通常将链栈表示成图3.3 的形式。

链栈基本操作的实现如下:

⑴ 置空栈
1 LinkStack Init_LinkStack()
2 { 
3     return NULL;
4 }
⑵ 判栈空
1 int Empty_LinkStack(LinkStack top )
2 { 
3     if(top==-14         return 1;
5     else 
6         return 0;
7 }
⑶ 入栈
1 LinkStack Push_LinkStack(LinkStack top, datatype x)
2 { 
3     StackNode *s;
4     s=mallocsizeof(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  阅读(861)  评论(0编辑  收藏  举报