栈的各种操作

一.设置相应的结构体

typedef int value;
typedef struct{
value *top;      //栈顶指针 
value *base;     //栈底指针,在构造之前以及销毁之后其base的值为NULL 
int stacksize;   //当前存储数据的空间的大小 
}SqStack;

注意stacksize是指相应的当前的栈的空间。
二.创建栈的空间

int InitStack(SqStack &s)      //创建一个新的栈 
{
 s.base =(value *)malloc(STACK *sizeof(value));
 if(!s.base)
 {
  exit(OVERFLOW);
  printf("创建失败,请重新输入:");
 }else{
  s.base = NULL;
  s.top = s.base;
 s.stacksize = STACK;
 printf("创建成功,请进行下一步操作:");
 }
 return OK;
}

创建空间时可以是将s.base == s.Top设置为0或者可以不设置。

三.判断栈是否为空

int ifempty(SqStack s)       //判断此栈是否为空 
{ 
 if(s.top == NULL || s.base == NULL)
 {
  printf("创造的栈为空栈,请输入数值:\n");
 }
 else{
  printf("创造的栈不为空栈,请进行下一步操作:\n"); 
 }
 return OK;
 } 

注意:此处有两种判断方法
1.看s.Top与s.base是否等于NULL。
2.判断s.Top与s.base是否相等。
四.栈的输入与输出

int Push(SqStack &s,value T)             //往创建好的栈当中输入相应的数字 
{
 if(s.top - s.base >= s.stacksize)   //栈满,则追加一些空间 
 {
  s.base = (value *)realloc(s.base,(s.stacksize + ADD)*sizeof(value));
  if(!s.base)
  {
   exit(OVERFLOW);
  }
  s.top = s.base + s.stacksize;
     s.stacksize = s.stacksize + STACK;          //扩充后的空间 
 }
     *s.top++ = T;                
     return OK;
}
int input(SqStack s)
{
 int i=0;
 int n=0;
 value j=0;
 printf("请输入想要输入的个数(每个数字用回车隔开):");
 scanf("%d", &n);
 for(i=0; i<n; i++)
 {
  printf("请输入数字:");
  scanf("%d", &j);
  Push(s,j);
 }
 return OK;
 } 
int Pop(SqStack &s,value &T)         //输出相应的栈 
{
 if(s.top == NULL || s.base == NULL)
 if(s.base)
 {
  T = *--s.top;
  printf("其数字为:%d", T); 
 }
 return OK;
}

此处在输入时要考虑是否有足够的储存空间,若是没有足够的空间那么就需要realloc再次分配一些空间。
*s.top++ = T(s.top是在栈最上方元素的上一位其先要在此位置输入相应的数字,再将s.top所指的向上移一位)。
对于栈的输出来说其在输出时需要注意s.base是否为NULL。
(此处需注意的是由于栈顶指针的位置问题,在输出元素时需要将栈顶指针先向下移一位再进行输出)。
六.栈基本知识
1.栈是先进后出的结构。
2.创建栈的空间之前要先宏定义相应的空间。
3.栈顶指针始终在栈顶元素的下一个位置上。
4.判断栈是否为空的方法:一.判断其栈头与栈尾指针是否等于NULL(此处要先看是否在创建空间时设置了NULL)。
二.判断s.top与s.base是否相等。
5.进栈与出栈时要注意空间大小以及相应指针的位置。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值