数据结构 顺序栈实现(C++)

1、栈(Stack) 

栈是限定在表尾进行插入删除的线性表(尾插尾删)。表尾端为栈顶(An),表头为栈底(A1)。栈是后进先出(LIFO)的线性表。

出栈:从栈顶(表尾)删除最后一个元素

入栈:插入到栈顶

*只能在栈顶运算,且访问结点时依照LIFO(后进先出)原则。


2、顺序栈

利用一组地址连续的存储单元依次存放自栈底到栈顶的数据元素。栈底一般在低地址端。

存储方式:同一般线性表的顺序存储结构完全相同。

简单、方便,但容易溢出。


·附设top指针,指示栈顶元素在顺序栈中的位置。但是,为了方便操作,通常top指示真正的栈顶元素之上的下标地址

·另设base指针,指示栈底元素在顺序栈中的位置。
·另外,用stacksize表示栈可使用的最大容量


3、顺序栈存储结构

#define MAXSIZE  5 //顺序栈存储空间的初始分配量
typedef int Status;
typedef int SElemType;

typedef struct {
   SElemType *base;//栈底指针
   SElemType *top;//栈顶指针
   int stacksize;//栈可用的最大容量
} SqStack;

base为栈底指针,初始化完成后,栈底指针base始终指向栈底的位置,若base的值为NULL,则表明栈结构不存在。

top 为栈顶指针,其初值指向栈底。每当插入新的栈顶元素时,指针top增1;删除栈顶元素时,指针top减1。

因此,栈空时,top和base的值相等,都指向栈底;栈非空时,top始终指向栈顶元素的上一个位置。


4、顺序栈表示

空栈:base == top
栈满:top-base==stacksize

元素个数:top-base

上溢:栈满又压入元素

下溢:栈空又弹出元素(通常为结束条件:base == top

栈满时的处理方法:

1、报错,返回操作系统。
2、分配更大的空间,作为栈的存储空间,将原栈的内容移入新栈。(耗费大量时间)


5、顺序栈初始化

为顺序栈动态分配一个预定义大小数组空间。
1、为顺序栈动态分配一个最大容量是MAXSIZE的数组空间,使base指向这段空间的基地址,即栈底。
2、栈顶指针top初始为base,表示栈为空。

3、 stacksize置为栈的最大容量MAXSIZE。

//算法3.1 顺序栈的初始化
Status InitStack(SqStack &s)
{
   //构造一个空栈S
   s.base = new SElemType[MAXSIZE];//为顺序栈动态分配一个最大容量为MAXSIZE的数组空间
   if(!s.base)
      exit(OVERFLOW); //存储分配失败
   s.top = s.base; //top初始为base,空栈
   s.stacksize = MAXSIZE; //stacksize置为栈的最大容量MAXSIZE
   return OK;
}

6、判断空栈

base == top

bool StackEmpty(SqStack s)
{
    if (s.top==s.base)return 1;
    return 0;
}

7、清空栈

使栈为空

Status ClearStack(SqStack s)
{
    if (s.base) s.top = s.base;
    return OK;
}

销毁栈

使栈不存在

void DestroyStack(SqStack &s)
{
   /* 销毁栈S,S不再存在 */
   delete []s.base;
   s.base = s.top = NULL;
   s.stacksize = 0;
}

8、入栈

①判断是否栈满

②压入新元素,栈顶指针+1

Status Push(SqStack &s, SElemType e)
{
    if (s.top-s.base==s.stacksize) return ERROR;
    *s.top++=e;//*s.top=e;s.top++;将元素e压入栈顶,栈顶指针++
    return OK;
}

9、出栈

①判断是否栈空

②栈顶指针-1,弹出栈顶元素

Status Pop(SqStack &s, SElemType &e)
{
    if (s.base==s.top) return ERROR;
    e=*--s.top;//--s.top;e=*s.top 栈顶指针--,将栈顶元素赋给e
    return OK;
}

10、取栈顶元素

栈非空时,返回栈顶元素,栈顶指针不变

SElemType GetTop(SqStack s)  
{
    if (s.top!=s.base) //栈非空 
    return *(s.top-1);//返回S的栈顶元素,不修改栈顶指针
}

11、输出栈

void PrintStack(SqStack s)
{
   for(SElemType *top = s.top - 1; top >= s.base; top--) {
      cout << (*top);
      if(top != s.base)
         cout << ' ';
   }
   cout << endl;
}

12、栈长

元素个数:top-base

int StackLength( SqStack s)
{
    return s.top - s.base;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值