赞
踩
- #include <stdio.h>
- #include<stdlib.h>
- #include <iostream>
- using namespace std;
-
- // 函数结果状态代码
- #define TRUE 1
- #define FALSE 0
- #define OK 1
- #define ERROR 0
- #define OVERFLOW -1
-
- #define STACK_INIT_SIZE 100 //存储空间初始分配量
- #define STACKINCREMENT 10 //存储空间分配增量
- typedef int SElemType; // 定义栈元素类型为整型
- /* 顺序栈类型定义 */
- typedef struct
- {
- SElemType *base; //栈的基址即栈底指针
- SElemType *top; //栈顶指针
- int stacksize; //当前分配的空间
- }SqStack;
-
- void input(SElemType &s);
- void output(SElemType s);
-
- void InitStack(SqStack &S);// 构造一个空栈S
- void DestroyStack(SqStack &S); // 销毁栈S,S不再存在
- void ClearStack(SqStack &S); // 把S置为空栈
- int StackEmpty(SqStack S); // 若栈S为空栈,则返回TRUE,否则返回FALSE
- int StackLength(SqStack S); // 返回S的元素个数,即栈的长度
- int GetTop(SqStack S,SElemType &e); // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
- void Push(SqStack &S,SElemType e); // 插入元素e为新的栈顶元素
- int Pop(SqStack &S,SElemType &e); // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
- void StackTraverse(SqStack S,void(*visit)(SElemType)); // 从栈底到栈顶依次对栈中每个元素调用函数visit()
-
-
- int main()
- {
- int j;
- SqStack s;
- SElemType e;
- InitStack(s);
- int i;
- cin>>i;
- for(j=0;j<i;j++)
- {
- input(e);
- Push(s,e);
- }
- printf("栈中元素依次为:");
- StackTraverse(s,output);
- Pop(s,e);
- printf("弹出的栈顶元素 e=%d\n",e);
- printf("栈空否:%d(1:空 0:否)\n",StackEmpty(s));
- GetTop(s,e);
- printf("栈顶元素 e=%d 栈的长度为%d\n",e,StackLength(s));
- ClearStack(s);
- printf("清空栈后,栈空否:%d(1:空 0:否)\n",StackEmpty(s));
- DestroyStack(s);
- printf("销毁栈后,s.top=%u s.base=%u s.stacksize=%d\n",s.top,s.base, s.stacksize);
- }
- /*****SElemType类型元素的基本操作*****/
- void input(SElemType &s)
- {
- cin>>s;
- }
- void output(SElemType s)
- {
- cout<<s<<" ";
- }
-
- /*****顺序栈的基本操作*****/
- void InitStack(SqStack &S)
- {
- // 构造一个空栈S
- /********** Begin **********/
-
- if (!(S.base = (SElemType*)malloc(STACK_INIT_SIZE *
- sizeof(SElemType))))
- exit(OVERFLOW);
- S.top = S.base;
- S.stacksize = STACK_INIT_SIZE;
- /********** End **********/
- }
-
- void DestroyStack(SqStack &S)
- {
- // 销毁栈S,S不再存在
- /********** begin**********/
- free(S.base);
- S.base = NULL;
- S.top = NULL;
- S.stacksize = 0;
- /********** End **********/
- }
-
- void ClearStack(SqStack &S)
- {
- // 把S置为空栈
- /********** Begin **********/
- if(StackEmpty(S))
- return ;
- else
- S.top = S.base;
- /********** End **********/
- }
-
-
- int StackEmpty(SqStack S)
- {
- // 若栈S为空栈,则返回TRUE,否则返回FALSE
- /********** Begin **********/
- if (S.top == S.base)
- return TRUE;
- else
- return FALSE;
- /********** End **********/
- }
-
-
- int StackLength(SqStack S)
- {
- // 返回S的元素个数,即栈的长度
- /********** Begin **********/
- return S.top - S.base;
-
- /********** End **********/
- }
-
-
- int GetTop(SqStack S,SElemType &e)
- {
- // 若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERROR
- /********** Begin **********/
- if (S.top > S.base)//非空时
- {
- e = *(S.top - 1);//先-1,后取内容,指针不对
- return OK;
- }
- else
- return ERROR;
- /********** End **********/
- }
-
-
- void Push(SqStack &S,SElemType e)
- {
- // 插入元素e为新的栈顶元素
- /********** Begin **********/
- if (S.top - S.base >= S.stacksize)//考虑满问题
- {
- if (!(S.base = (SElemType*)realloc(S.base, (S.stacksize + STACKINCREMENT ) * sizeof(SElemType))))
- exit(OVERFLOW);
- S.top = S.base + S.stacksize;//栈顶移动
- S.stacksize += STACKINCREMENT ;
- }
- *(S.top)++ = e; //先放元素,然后+1移动
- /********** End **********/
- }
-
- int Pop(SqStack &S,SElemType &e)
- {
- // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
- /********** Begin **********/
- if (S.top == S.base)
- return ERROR;
- e = *--S.top;//先-1,后取内容
- return OK;
- /********** End **********/
- }
-
- void StackTraverse(SqStack S,void(*visit)(SElemType))
- {
- // 从栈底到栈顶依次对栈中每个元素调用函数visit()
- /********** Begin **********/
- if (!StackEmpty(S))
- for(SElemType *p=S.base;p<S.top;p++)
- visit(*p);
- printf("\n") ;
-
- /********** End **********/
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。