#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 --; } }