#include <iostream> using namespace std; /* 本节学习 一种特殊的线性表——栈。以前学习的顺序表和单链表都是很随意的,但栈不同,它要求插入删除只在栈顶进行 ——这就是栈的特点。既然只能在栈顶操作,所以在输出元素时就有 “先进后出”的特点。 总之一句话,栈就是操作受到限制的线性表——只在栈顶插入删除。 */ /*定义栈 的数据结构 ,所有的操作算法都是对于这个结构的操作*/ #define ELEMTYPE int #define STACK_SIZE 100 typedef struct SqStack { ELEMTYPE *elem; //ELEMTYPE elem[STACK_SIZE]// 此处必须是指针,而不能像书中那样,写成数组形式。因为写成数组,定义SqStack变量时就分配内存了。 int top; int stackSize; }SqStack; /*初始化栈,为栈分配内存,并进行初始化*/ void initStack(SqStack &S) { S.elem = new ELEMTYPE[STACK_SIZE]; S.top =-1; S.stackSize =STACK_SIZE; } /*销毁栈,释放栈所占内存,并初始化*/ void destroyStack(SqStack & S) { delete []S.elem; S.top = -1; S.stackSize = 0; } int getLength(SqStack *s) { return s->top+1; } /*清空栈,“不”释放内存,只是初始化栈顶序号*/ void clearStack(SqStack* S) { S->top = -1; } /*添加元素,即入栈*/ void pushStack(SqStack * s,ELEMTYPE x) { /* LIST OF THE PROCEDURE: 判断栈是否满 新元素入栈 */ if (s->top == s->stackSize-1) { cout<<"栈已经满了"<<endl; return ; } //元素入栈 s->top ++;//、、、、top 指向的是栈顶元素,插入位置应该是top+1 s->elem[s->top]= x; } /*删除元素,即出栈*/ ELEMTYPE popStack(SqStack *s)//、、、、、、、注意num 是从1开始计数的,而top 是从0 开始的 { /* LIST OF THE PROCEDURE : 判断栈是否为空 删除元素(所谓删除元素就是栈顶位置减1 即 top-1) */ // if (s->top ==-1) { cout<<"栈已空"<<endl; return NULL; } // // ELEMTYPE x =s->elem[s->top ]; s->top--; return x; } ELEMTYPE getElem(SqStack * s, int num)//、、、这个操作是对的,但对于栈是不允许的,因为栈只能在栈顶操作,所以只能从栈顶去元素.所以这个函数需要修改成书中形式 { /* LIST OF THE PROCEDURE: 判断栈是否已空 判断提取位置是否越界 返回元素值 */ // if (s->top == -1) { cout<<"栈已空"<<endl; return NULL; } // if (num-1 > s->top) { cout<<"提取位置越界"<<endl; return NULL; } // return s->elem[num-1]; } /*输出所有元素*/ void display(SqStack *s) { int i=0; for (i =0; i<=s->top ;i++) { cout<<s->elem[i]<<endl; } } void main() { SqStack S; initStack(S); //添加元素 int i=0; for (i =0; i< 10 ;i++) { pushStack(&S, i); } //删除元素 popStack(&S); popStack(&S); //输出元素 cout<<"----输出栈中 元素-----"<<endl; display(&S); // destroyStack(S); }