栈的基本

#include<stdio.h>                            //用数组创建栈
#include<stdlib.h>
#define stack_init_size 100
#define stack_newlenth  100                   //新增加的长度
struct stack{
 int size;
 int *top;
 int *base;
}s;
void initstack()                                    //初始化栈
{
 s.base=(int *)malloc(stack_init_size * sizeof(int));            //s.base 指向的地址大小为层数*int字节数
 if(!s.base)                                                     //如果s.base为空,则分配失败。正常应该存地址
  printf("分配空间失败");
 s.top=s.base;                                                   //注意不能赋反
 s.size=stack_init_size;
}

int is_empty()                                     //判断栈是否为空
{
if(s.base==s.top)
return 1;
else 
return 0;
}
void push(int i)                                            //入栈
{
 if(s.top-s.base>=s.size)
 {
  s.base=(int *)realloc(s.base,(stack_init_size+stack_newlenth)*sizeof(int));  
  if(!s.base)                //如果内存满,重新分配。如果分配的内存被占用,则realloc函数自动复制所有值重新寻找新的空间
   printf("重新分配失败");
  s.top=s.base+s.size;
  s.size=stack_init_size+stack_newlenth;
 }
 *s.top=i;
 s.top++;
}
int out()                         //出栈
{
 int e;
 if(is_empty() )
  return 0;
 s.top--;
 e=*s.top;
 return e;

}
int gettop()                        //栈顶元素
{ 
 int num;
 if(is_empty())
 {
  printf("impossible!");
  return 0;
 }  
 num=*(s.top-1);
 return num;
}

int  main()
{
 int n,i,x,j,k,q;
printf("输入入栈次数:");
 scanf("%d",&n);
 for(i=1;i<=n;i++)
 {
  printf("输入操作数:");
  scanf("%d",&x);
  if(x==1)
  {
   scanf("%d",&j);
   push(j);
  }
  else if( x==2)
  {    k=out();
   if(k) 
             k;
   else 
   {
    
    printf("impossible!");               //如果栈为空就不能再出战,程序结束
    return 0;
   }
  }
  else if(x==3)
  {
   q=gettop();
   if(q)
   {
    printf("栈顶元素为:"); 
    printf("%d\n",q);
   }
            else 
    return 0;                    //如果栈为空,则查看不了栈顶元素,程序结束; 

     
  }
 }

 return 0;
}
//其次还有清空栈和销毁栈
//清空就是让s.top==s.base

//销毁就是free(s.base);


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值