C语言实现顺序栈

    顺序栈,就是用一组地址连续的存储单元来存放栈元素,然后用一个栈结构去维护一个栈。在C中,可用动态开辟的数组去表示,维护的栈结构需要有一个栈底和一个栈顶指针。因为开辟一个数组需要事先知道它的大小,所以栈结构里就必须还有一个整型变量来表示当前栈的存储容量,再可定义一个变量用来扩充栈的最大容量。实现如下:

#include<cstdio>
#include<cstdlib>
#include<malloc.h>
//顺序栈实现
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 10//存储空间分配增量
typedef struct{
  int *base;//在栈构造之前和销毁之后,base的值为NULL
  int *top;//栈顶指针
  int stacksize;//当前已分配的存储空间,已元素为单位
}SqStack;
//顺序栈基本操作实现
//构造一个空栈
//初始化成功返回true
bool InitStack(SqStack &S){
  S.base = (int *)malloc(STACK_INIT_SIZE * sizeof(int));
  if(!S.base){
    exit(-1);//存储分配失败
  }
  S.top = S.base;
  S.stacksize = STACK_INIT_SIZE;
  return true;
}

//销毁栈S,S不在存在
//销毁成功,返回true
int DestroyStack(SqStack &S){
   if (S.base == NULL) exit(1); //栈结构不存在,程序异常退出
   free(S.base);
   S.base = NULL;
   return true;
}

//把S置为空栈
//成功返回true
int ClearStack(SqStack &S){
   if(S.base == NULL) exit(1);
   S.base = S.top;
   return true;
}

//判断是否空栈
//返回,true-空栈,false-非空栈
int StackEmpty(SqStack &S){
   if(S.base == NULL) exit(1);
   int ret = S.top - S.base ? false : true;
   return ret;
}

//返回当前栈的长度
//成功返回当前栈的长度,异常退出
int StackLength(SqStack &S){
   if(S.base == NULL) exit(1);
   return S.top - S.base;
}

//取出栈顶元素
int GetTop(SqStack &S, int &e){
   if(S.top - S.base == 0){
    return false;
   }
   e = *(S.top - 1);
}

//入栈
int Push(SqStack &S, int e){
  //插入元素e为新的栈顶元素
  if(S.top - S.base >= S.stacksize){//栈满,追加存储空间
  S.base = (int *)realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(int));
  S.top = S.base + S.stacksize;
  S.stacksize += STACKINCREMENT;
  }
  * S.top++ = e;
  return true;
}

//出栈
int Pop(SqStack &S,int &e){
 //若栈不空,则删除S的栈顶元素,用e返回其值,并返回true,否则返回false
 if(S.top - S.base == 0) return false;
 e = * --S.top;
 return true;
}

猜你喜欢

转载自blog.csdn.net/qlzx_syzx/article/details/81415187