【数据结构】顺序栈的实现

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define TURE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef struct{
  char name[10];
  int stuNo;
}SElemType;
typedef struct{
 SElemType* base;//栈底指针,在栈构造和销毁之前,base的值NULL
 SElemType* top;//栈顶指针
 int stacksize;//当前已分配的存储空间,以元素为单位
}SqStack;
Status InitStack(SqStack &s){
 //构造一个空栈
 s.base = (SElemType*)malloc(STACK_INIT_SIZE*sizeof(SElemType));
 if(!s.base) exit(OVERFLOW);
 s.top=s.base;
 s.stacksize=STACK_INIT_SIZE;
 return OK;
}
Status GetTop(SqStack s,SElemType &sElem){
    //如果栈不空,用sElem返回s的栈顶元素,并返回OK
    if(s.top==s.base) return ERROR;
    sElem = *(s.top-1);
    return OK;

}
Status Push(SqStack &s,SElemType sElem){
  //插a入sElem元素为新的栈顶元素
  if(s.top-s.base>=s.stacksize){
    //栈满,追加存储空间
    s.base = (SElemType*) realloc(s.base,(s.stacksize+STACKINCREMENT)*sizeof(SElemType));
    if(!s.base) return OVERFLOW;
    s.top = s.base+s.stacksize;//重新使top指向栈顶
    s.stacksize+=STACKINCREMENT;
  }
  *s.top=sElem;
  s.top++;
  return OK;
}
Status Pop(SqStack &s,SElemType &sElem){
   //出栈操作
   //若栈不空,则删除栈顶元素,并用sElem返回其值
   //失败返回ERROR,成功返回OK
   if(s.base==s.top) return ERROR;
   sElem=*(--s.top);
   return OK;
}
Status EmptyStack(SqStack s){
  //判断栈是否为空,如果为空,返回TURE,否则返回FALSE
  if(s.base==s.top) return TURE;
  else return FALSE;
}
int StackLength(SqStack s){
  //返回栈的元素个数,即栈的长度
  return s.top-s.base;
}
Status DestroyStack(SqStack &s){
    //销毁栈
  s.top=s.base;
  free(s.base);
  s.stacksize=0;
  return OK;
}
void StackTraverse(SqStack s){
  //遍历打印栈中的内容
  SElemType* p=s.base;

  for(;p<s.top;p++){
  printf("%d %s \n",p->stuNo,p->name);
  }
}
int main()
{
    SqStack s;
    InitStack(s);
    SElemType sElem;
    for(int i=0;i<3;i++){
       scanf("%d%s",&sElem.stuNo,sElem.name);
        Push(s,sElem);

    }
    StackTraverse(s);
    Pop(s,sElem);
    StackTraverse(s);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值