/*
顺序栈的基本操作
栈空条件:S.base == S.top
栈中元素个数:S.top - S.base
栈顶指针始终指向栈顶元素的下一个位置上
*/
#include<iostream>
#include<malloc.h>
#include<stdlib.h>
#define STACK_INIT_SIZE 50 //栈的初始大小
#define STACK_INCREASEMENT 10 //栈的大小的增量
using namespace std;
typedef int ElemType; //定义栈中的数据类型
//栈结构的定义
typedef struct {
ElemType* base; //栈底指针
ElemType* top; //栈顶指针
int stacksize; //当前已经分配的栈的大小
}SqStack;
//初始化栈(构造空栈)
void InitStack(SqStack& S) {
S.base = (ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
}
//入栈操作
void Push(SqStack &S, ElemType a) {
// 栈满,追加存储空间
if (S.top - S.base == S.stacksize) {
S.base = (ElemType*)realloc(S.base, (S.stacksize + STACK_INCREASEMENT) * sizeof(ElemType));
if (S.base == NULL) //内存重新分配失败
exit(0);
S.top = S.base + S.stacksize;//重新定位栈顶指针
S.stacksize += STACK_INCREASEMENT;//重新设置已分配栈的大小
}
*S.top++ = a;
}
//出栈操作
void Pop(SqStack &S,ElemType &b) {
if (S.top == S.base) { //栈为空
cout << "栈为空!" << endl;
exit(0);
}
b = *(--S.top);
}
//查看栈顶元素
ElemType GetTop(SqStack S) {
if (S.top == S.base) {
cout << "栈为空!" << endl;
exit(0);
}
return *(S.top-1);
}
//输出栈内元素(栈顶->栈底)
void PrintStack(SqStack S) {
if (S.top == S.base) {
cout << "栈为空!" << endl;
exit(0);
}
cout << "栈中的元素为(栈顶->栈底):";
while (S.top > S.base)
{
cout << *--S.top << " ";
}
cout << endl;
}
//销毁栈
void DestroyStack(SqStack &S) {
if (S.base) {
free(S.base);
S.base = NULL;
S.top = NULL;
S.stacksize = 0;
}
}
//清空栈
void ClearStack(SqStack& S) {
S.top = S.base;
}
int main()
{
SqStack S;
InitStack(S);
for (int i = 0; i < 10; i++)
{
Push(S,(char)i);
}
PrintStack(S);
//连续两次出栈
ElemType x;
Pop(S,x);
cout << "出栈:" << x << " " << "栈顶元素:" << GetTop(S) << endl;
Pop(S, x);
cout << "出栈:" << x << " " << "栈顶元素:" << GetTop(S) << endl;
PrintStack(S);
//入栈
Push(S, 10);
PrintStack(S);
cout << "栈顶元素:" << GetTop(S) << endl;
cout << "清空栈:";
ClearStack(S);
PrintStack(S);
cout<<"销毁栈:"<<endl;
DestroyStack(S);
return 0;
}
运行结果