采用顺序存储实现栈的初始化、入栈、出栈操作。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

#define TRUE   1
#define FALSE  0
#define ERROR 0
#define OVERFLOW -2
#define STACK_INIT_SIZE 100
#define STACKINCREMENT  20
//typedef int Status;
typedef struct Stack{//顺序栈
    int  *base;
    int  *top;
    int    stacksize;      //栈可使用的最大容量
} SqStack;

int  InitStack (SqStack &S){ //0栈的初始化
    S.base=(int *)malloc (STACK_INIT_SIZE *sizeof(int));
    if (! S.base)  exit (OVERFLOW);
    S.top=S.base; 
    S.stacksize=STACK_INIT_SIZE;//栈的空间大小
    return 1;
}

int Push(SqStack &S, int e){//1入栈
    if (S.top - S.base>= S.stacksize){
        S.base=(int*)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
        if(!S.base) exit(OVERFLOW);//如果分配失败,则退出
        S.top=S.base+S.stacksize;//栈顶
        S.stacksize+=STACKINCREMENT;//栈空间
    }
    *S.top++=e;
 return 1;
}

int Pop(SqStack &S){//2出栈
 int e;
    if( S.top==S.base)
 {
  printf("栈为空\n");
  return ERROR;//空栈
 }
    e=*--S.top;
    return e;//返回栈顶元素
}

void Print(SqStack &S){//输出
 
    if( S.top==S.base)
 {
  printf("栈为空\n");
  return ;//空栈
 }
 while(S.top>S.base)
 {
  printf("%d  ",*S.base);
  S.base++;
 }
 printf("\n");
 return ;
 
}


void tip()
{
 printf("*********计科101陈东东*************\n");
    printf("输入0创建空栈\n");
 printf("输入1进栈\n");
 printf("输入2出栈\n");
 printf("输入4输出栈元素\n");
 printf("输入-1退出\n");
 printf("**********************\n");
}

int main()
{
 int x,k;
 SqStack S;
 //struct Stack S;
 tip();
 while(scanf("%d",&k),k!=-1)
 {
  switch(k)
  {
  case 0:InitStack(S);
   printf("操作完毕\n");
   tip();
   break;
  case 1:
   printf("请输入进栈元素:");
   scanf("%d",&x);
   Push(S, x);
   printf("操作完毕\n");
   tip();
   break;
  case 2:
   
   printf("%d 出栈\n",Pop(S));
   printf("操作完毕\n");
   tip();
   break;
  case 4:
   
       Print(S);
   printf("操作完毕\n");
   tip();
   break;
  }
 }
 
 return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值