参考了 严蔚敏 的 《数据结构》(C语言版)
用的是 顺序表 添加限制实现的 栈
栈就是线性表加上一定的限制。
本篇里的 栈顶指针 指向的是栈顶元素的下一个地址。
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define STACK_INIT_SIZE 100 //初始的栈长
#define STACKINCREMENT 10 //增加的栈长
#define SElemType int //假定数据类型是int型
#define Status bool
typedef struct{
SElemType * base; //地址
SElemType * top; //栈顶指针
int stacksize; //栈长度
} SqStack;
//构造一个空栈
Status InitStack(SqStack & S){
//申请空间,申请失败则返回false
S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType));
if(!S.base) return false;
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return true;
}
//push 入栈
Status Push(SqStack &S, SElemType e){
//空间不够则重新申请更大的空间
if((S.top-S.base)>=S.stacksize){
S.base = (SElemType * )realloc(S.base, (S.stacksize + STACKINCREMENT) * sizeof(SElemType));
if(!S.base) return false;
S.top = S.base + S.stacksize;
}
*S.top++ = e; //因为top在元素之上,所以先赋值后移动指针
cout<<S.top<<endl;
cout<<S.base<<endl;
return true;
}
//pop 出栈
Status Pop(SqStack & S, SElemType & e){
if(S.base == S.top) return false; //此时栈里面没有元素
e = *--S.top; //此栈的设计是top指向最顶元素的上一个地址
return true;
}
//GetTop 获得栈顶元素
Status GetTop(SqStack & S, SElemType & e){
if(S.base == S.top) return false; //空栈的情况
e = *(S.top-1);
return true;
}
//获得栈内元素的个数
int StackLength(SqStack S){
return S.top - S.base;
}
int main(int argc, char** argv) {
// SqStack s;
// InitStack(s);
// SElemType e;
// Push(s, 3);
// Push(s, 4);
// cout<<StackLength(s)<<endl;
// Pop(s,e);
// cout<<e<<endl;
// Pop(s,e);
// cout<<e<<endl;
return 0;
}