第三章 栈
- /*****************************SqList**********************************
- Date:2008.10.30
- Author:ZORO
- WebSite:http://blog.youkuaiyun.com/sevenhu
- ======================================================================
- 参考资料:
- BOOK:数据结构(C语言版) 严蔚敏 清华大学出版社
- Page:47
- ======================================================================
- ADT SqStack {
- InitStack(&S)
- DestroyStack(&S)
- ClearStack(&S)
- StackEmpty(S)
- StackLength(S)
- GetTop(S,&e)
- Push(&S,e)
- Pop(&S,&e)
- StackTraverse(S)
- }ADT SqStack
- ======================================================================
- note:VC++ 6.0测试通过。
- *********************************************************************/
- #include <iostream>
- using namespace std;
- #define STACK_INIT_SIZE 100 //存储空间初始化量
- #define STACKINCREMENT 10 //存储空间增量
- #define OK 1
- #define ERROR 0
- #define OVERFLOW -1
- #define NULL 0
- typedef int Status; //返回值标志
- typedef bool BOOL;
- typedef struct
- {
- int * base;
- int * top;
- int stacksize;
- }SqStack;
- Status InitStack(SqStack &S)
- {
- //构造一个空栈
- int * bp = (int *)malloc(STACK_INIT_SIZE * sizeof(int)); //分配空间
- if (bp == NULL)
- {
- exit(OVERFLOW);
- }
- else
- {
- S.top = S.base = bp; //初始化
- }
- S.stacksize = STACK_INIT_SIZE; //栈容量
- bp = NULL;
- return OK;
- }//InitStack
- Status DestroyStack(SqStack &S)
- {
- //销毁栈
- int * bp = S.base ;
- free(bp); //释放空间
- bp = S.base = S.top = NULL; //销毁栈信息
- S.stacksize = 0;
- return OK;
- }//DestroyStack
- Status ClearStack(SqStack &S)
- {
- //清空栈
- S.top = S.base;
- return OK;
- }//ClearStack
- BOOL StackEmpty(SqStack S)
- {
- //判断栈空
- if (S.base == S.top )
- {
- return true;
- }
- else
- {
- return false;
- }
- }//StackEmpty
- int StackLength(SqStack S)
- {
- //反回栈的长度
- int i = 0;
- int * pbase = S.base ;
- int * ptop = S.top ;
- while (pbase != ptop) {
- ++i;
- ++pbase;
- }
- pbase = ptop = NULL;
- return i;
- }//StackLength
- Status GetTop(SqStack S, int &e)
- {
- //e返回栈顶元素
- if (StackEmpty(S))
- {
- return ERROR;
- }
- else
- {
- e = *(S.top - 1);
- return OK;
- }
- }//GetTop
- Status Push(SqStack &S, int e)
- {
- //插入元素e到栈顶
- int * pb = NULL;
- if (S.top - S.base >= S.stacksize )
- {
- pb = (int *)realloc(S.base,
- (S.stacksize + STACKINCREMENT) * sizeof(int)); //追加空间
- if (pb == NULL)
- {
- exit(OVERFLOW);
- }
- else
- {
- S.base = pb; //新栈底指针位置
- S.top = S.base + S.stacksize ; //确定top位置
- S.stacksize += STACKINCREMENT;
- }
- }
- *S.top++ = e; //插入元素,栈顶指针上移
- pb = NULL;
- return OK;
- }//Push
- Status Pop(SqStack &S, int &e)
- {
- //弹出栈顶元素给e
- if (StackEmpty(S))
- {
- return ERROR;
- }
- else
- {
- e = *--S.top ; //栈顶指针下移,返回元素
- return OK;
- }
- }//Pop
- Status StackTraverse(SqStack S)
- {
- //遍历栈
- int * pb = NULL;
- if (StackEmpty(S))
- {
- return ERROR;
- }
- else
- {
- pb = S.base;
- while (pb != S.top)
- {
- cout << *pb++ << " "; //输出当前元素,并把指针上移
- }
- cout << endl;
- return OK;
- }
- }//StackTraverse
- int main()
- {
- SqStack S;
- InitStack(S);
- for (int i=0; i<10; ++i)
- {
- Push(S,i);
- }
- cout << "压栈成功!" << endl;
- StackTraverse(S);
- cout << "弹出2个元素" << endl;
- int e = 0;
- for (i=0; i<2; ++i)
- {
- Pop(S,e);
- cout << e << endl;
- }
- cout << "弹出成功!" << endl;
- StackTraverse(S);
- cout << "栈的长度:" << StackLength(S) << endl;
- GetTop(S,e);
- cout << "栈顶元素是" << e << endl;
- cout << "清空栈..." << endl;
- ClearStack(S);
- cout << "重新压栈!" << endl;
- for (i=10; i>0; --i)
- {
- Push(S,i);
- }
- StackTraverse(S);
- cout << "销毁栈..." << endl;
- DestroyStack(S);
- return 0;
- }