#include<iostream>
#include<stdlib.h>
using namespace std;
#define STACK_SIZE 100
struct Stack{
int *top;
int *base;
int Size;
}Stack;
/**********************
* Function Statements
**********************/
bool InitStack(struct Stack &S); //构建栈
bool IsEmpty(struct Stack &S); //判断栈空
bool IsFull(struct Stack &S); //判断栈满
void Push(struct Stack &S, int e); //压栈,插入数据
void Pop(struct Stack &S, int &e); //删除,即弹出数据
bool DestroyStack(struct Stack &S); //销毁栈
bool ClearStack(struct Stack &S); //清空栈
void PrintStack(struct Stack &S); //打印栈中元素,即输出
/**********************
* Main *
***********************/
int main()
{
struct Stack S;
int b, n;
if(InitStack(S)==false){
cout << "Init Stack error!" << endl;
exit(0);
}
cout << "push a data into stack:" << endl;
cin >> n;
//压栈
cout << "压栈操作" << endl;
while(n--){
Push(S, n);
PrintStack(S);
}
//弹栈
cout << "弹栈操作" << endl;
while(n<4){
Pop(S, b);
PrintStack(S);
n++;
}
//清栈
cout << "清栈操作" << endl;
if(ClearStack(S))
PrintStack(S);
//销毁栈
cout << "销毁栈操作" << endl;
DestroyStack(S);
cout << "S.base = " << S.base << "; " <<"S.top = " << S.top << "; "
<< "S.Size = " << S.Size << endl;
return 0;
}
/*******************************
* PrintStack
* 打印栈中的元素,自顶向下显示
* 即从栈尾输出到栈首
*******************************/
void PrintStack(struct Stack &S){
int n = S.top - S.base;
int index;
//若栈空则输出
if(!n){
cout << ".................................." << endl;
cout << "Stack is Empty..."<<endl;
cout << ".................................." << endl;
return;
}
//非空时
cout << ".................................." << endl;
cout << "栈中的数据(从栈顶元素开始向下显示)" << endl;
for(index = 1; index<=n; ++index){
cout << *(S.top - index) << " ";
}
cout << endl;
}
/*******************************
*InitStack
*动态分配内存
*并对栈的属性初始化
*******************************/
bool InitStack(struct Stack &S){
S.base = (int* ) malloc (STACK_SIZE *sizeof(Stack));
if(S.base == NULL){
cout << "malloc stack error" << endl;
return false;
}
S.top = S.base;
S.Size = STACK_SIZE;
return true;
}
/*******************************
*ClearStack
*清空栈内数据
*******************************/
bool ClearStack(struct Stack &S){
S.top = S.base;
return true;
}
/*******************************
*DestroyStack
*销毁栈S,释放内存
*并将指针属性置空
*防止悬浮指针产生
*******************************/
bool DestroyStack(struct Stack &S){
free(S.base);
S.base = NULL; //不用的指针一定用指向空
S.top = NULL; //防止悬浮指针的产生
S.Size = 0;
return true;
}
/*******************************
*IsEmpty
*判断栈是否为空
*即判断S.top == S.base ?
*若S.top == S.base 则表示栈空
*******************************/
bool IsEmpty(struct Stack &S){
if(S.top == S.base)
return true;
else
return false;
}
/******************************************
*IsFull
*判断栈是否存满
*A = S.top - S.base 代表此时栈中所有元素
*B = S.Size 表示栈被分配的空间
*若A >= B, 则表示栈溢出
******************************************/
bool IsFull(struct Stack &S){
int A = S.top - S.base;
int B = S.Size;
if(A >= B){
cout << "Stack is Full" << endl;
return true;
}
else
return false;
}
/************************************************************
*Push
*压栈操作
*栈是特殊的线性表,其不支持随机访问,因此只能按照顺序存储。
*例如:子弹夹上子弹(该例子与本实现不同的是
*++子弹夹栈顶指针保持不变,栈底指针游动。
*++本程序实现的是栈底指针不变,栈顶指针游动。)
*************************************************************/
void Push(struct Stack &S, int e){
if(!IsFull(S)){
*(S.top) = e;
S.top ++;
}
}
/******************************************************************
* Pop
* 弹栈操作
* 栈是特殊的线性表,其不支持随机访问,因此只能按照顺序存储。
* 例如:子弹夹推出子弹(该例子与本实现不同的是
* ++子弹夹栈顶指针保持不变,栈底指针游动。
* ++本程序实现的是栈底指针不变,栈顶指针游动。)
*******************************************************************/
void Pop(struct Stack &S, int &e){
if(IsFull(S)){
cout << "Pop error" << endl;
}
else{
e = *(S.top - 1);
S.top --;
}
}