栈的运算和基本概念

  栈(stack)是一种只允许在一段进行插入和删除的线性表,它是一种操作受限的线性表。表中只允许插入和删除的一端称为顶端(top),另一端称为底端(buttom)。栈的插入操作通常称为进栈入栈(push),栈的删除操作为出栈或者退栈(Pop)。当栈中无元素时称为空栈。

  栈的顺序存储结构

     1、栈的顺序存储结构

             利用顺序存储方式实现的栈称为顺序栈。类似于顺序表的定义,栈中的数据元素用一个预设的足够长的一维数组来实现:datatype data[MAXSIZE],栈底位置可以设置在数组中的任意一个端点,栈顶是随着插入和删除的变化而变化的,用一个int top来作为前栈顶的位置:

       #define MAXSIZE  <栈最大元素数>

      typedef sturcut{

            datatype   data[MAXSIZE];

            int top;

     }SeqStack;

     定义一个指向顺序栈的指针:

       SeqStack *s;

     通常0下端设为栈底,这样空栈事的指针top=-1;入栈时,栈顶指针+1,即s->top++;出栈时,栈顶减一,即s->top--。

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

       (1)、置空栈:首先建立栈控间,然后初始化栈顶.

            SeqStack *Init(){

                      SeqStak *s;

                      s = (SeqStack *)malloc(sizeof(SeqStack));

                      s->top = -1;

                       return s;

            }

      (2)、判空栈

          int Empty(SeqStack *s){

                    if(s->top == -1)

return 1 ;

else

return 0;

          }

(3)、入栈

int Push(SeqStack *s,datatype x){

if(s->top ==MAXSIZE-1)

return 0;

else{

s->top++;

s->data[s->top]=x;

return 1;

}

}

(4)、出栈

int  Pop(SeqStack *s,datatype *x){

if(Empty(s))

return 0;

else{

*x=s->data[s->top];

s->top--;

return 1;

}

}

(5)、取栈顶元素

datatype  Top(SeaStack *s){

if(Empty(s))

return 0;

else

return (s->data[s->top]);

}

注意一下几点:

1.对于顺序栈,入栈时,首先判栈是否满了,满栈的条件是:s->top == MAXSIZE,栈满时不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。

2.出栈和取栈顶元素时应该判断栈是否为空,为空时不能操作,否则产生错误。

3.取栈顶元素与出栈的不同在于,top位置改不改变。

2、多栈共享邻接空间

两栈共享的数据结构可以定义为:

typedef struct{

Elemtype stack[MAXNUM];

int lefttop;

int righttop;

}dupsqstack;

左栈入栈时,栈顶指针加1,右栈入栈时,栈顶指针减1,。由于两个栈顶均可向中间伸展,互补余缺,因此每个栈的最大空间均大于m/2。为了识别左右栈,必须另外设定标志;

char  status;

status = 'L';

status = 'R';

在进行操作时,需要制定栈号,status = 'L'为左栈,status = 'R'为右栈;判断栈满的条件为:s->lefttop+1==s->righttop;

共享栈的基本操作如下:

(1)、初始化操作

int initDupStack(dupsqStack *s){

if((s = (dupsqStack *)malloc(sizeof(dupsqStack)))==NULL)

return false;

s->lefttop = -1;

s->righttop = MAXNUM;

return true;

}

(2)、入栈操作

int pushDupStack(dupsqStack *s,char status,Elemtypt x){

if(s->lefttop +1 == s->righttop)

return false;

if(status == 'L'){

s->stack[++s->lefttop] = x;

}

else(status == 'R')

s->stack[--s->lefttop] = x;

else

return false;

return true;

}

(3)、出栈操作

Elemtype popDupStack(dupsqstack  *s,char status){

if(status == 'L'){

if(s->lefttop<0)

return NULL;

else

return (s->stack[s->lefttop--]);

}

else if(status=='R'){

if(s->righttop > MAXNUM-1)

return NULL;

else 

return (s->stack[righttop++]);

}

else

return NULL;

}

3、栈的链式存储结构

栈的链式存储结构可参考链表 和 上面的栈的基本操作。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值