顺序实现
- #ifndef STACK_H_INCLUDED
- #define STACK_H_INCLUDED
- #include "ds.h" //for Status,OK ...
- #ifndef ElemType
- #define ElemType int /* 数据元素类型默认为 int */
- #define ELEMTYPE_TAG
- #endif
- #define SElemType ElemType
- ///
- //顺序栈的存储结构定义
- #define STACK_INIT_SIZE 100 /* 存储空间初始分配容量 */
- #define STACKINCREMENT 10 /* 存储空间分配的增量 */
- typedef struct {
- ElemType *base; //在构造栈之前和销毁栈之后,base为NULL
- ElemType *top; //栈顶指针
- int stacksize; //当前已分配的存储空间(元素个数)
- } SqStack;
- ///
- //顺序栈的基本操作声明
- //构造一个空栈S
- Status InitStack(SqStack &S);
- //销毁栈S
- Status DestroyStack(SqStack &S);
- //将栈S清空
- Status ClearStack(SqStack &S);
- //若栈S为空返回TRUE,否则FALSE
- Status StackEmpty(SqStack S);
- //返回栈S中的元素个数
- int StackLength(SqStack S);
- //用e返回栈顶元素
- // 前提:栈S存在且不空
- Status GetTop(SqStack S, ElemType &e);
- //元素e入栈S
- Status Push(SqStack &S, ElemType e);
- //S出栈用e返回出栈元素
- // 前提:栈S存在且不空
- Status Pop(SqStack &S, ElemType &e);
- ///
- //顺序栈的基本操作的实现
- //构造一个空栈S
- Status InitStack(SqStack &S)
- {
- // TODO (#1#): 构造一个空栈S
- S.base=(ElemType*)malloc(STACK_INIT_SIZE * sizeof(ElemType));
- if(!S.base) exit(OVERFLOW);
- SS.top=S.base;
- S.stacksize=STACK_INIT_SIZE;
- return OK;
- //-------------------------------------
- }
- //销毁栈S
- Status DestroyStack(SqStack &S)
- {
- // TODO (#1#):销毁栈S,相当于清空栈
- free(S.base);
- S.base=NULL;
- return OK;
- //-------------------------------------
- }
- //将栈S清空
- Status ClearStack(SqStack &S)
- {
- // TODO (#1#): 将栈S清空,释放所有结点
- ElemType e;
- while(Pop(S,e)!=ERROR);
- return OK;
- //-------------------------------------
- }
- //若栈S为空返回TRUE,否则FALSE
- Status StackEmpty(SqStack S)
- {
- // TODO (#1#): 若栈S为空返回TRUE,否则FALSE
- if(S.top==S.base)
- return OK;
- return ERROR;
- //-------------------------------------
- }
- //返回栈S中的元素个数
- int StackLength(SqStack S)
- {
- // TODO (#1#): 返回栈S中的元素个数
- return S.top-S.base;
- //-------------------------------------
- }
- //用e返回栈顶元素
- // 前提:栈S存在且不空
- Status GetTop(SqStack S, ElemType &e)
- {
- // TODO (#1#):若栈S不空,则用e返回栈顶元素
- if(S.top ==S.base)
- return ERROR;
- e=*(S.top-1);
- return OK;
- //-------------------------------------
- }
- //元素e入栈S
- Status Push(SqStack &S, ElemType e)
- {
- // TODO (#1#): 插入元素e作为新的栈顶
- if(S.top-S.base>=S.stacksize)
- {
- S.base=(ElemType *)realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(ElemType));
- if(!S.base)exit(OVERFLOW);
- SS.top=S.base+S.stacksize;
- S.stacksize+=STACKINCREMENT;
- }
- *S.top++=e;
- //*S.top=e;
- //S.top++;
- return OK;
- //-------------------------------------
- }
- //S出栈用e返回出栈元素
- // 前提:栈S存在且不空
- Status Pop(SqStack &S, ElemType &e)
- {
- // TODO (#1#):若栈S不空,则删除栈顶元素用e返回
- if(S.top==S.base)
- return ERROR;
- e=*--S.top;
- return OK;
- //-------------------------------------
- }
- #ifdef ELEMTYPE_TAG
- #undef ElemType
- #undef ELEMTYPE_TAG
- #endif
- #endif
- #include <stdio.h>
- #include <stdlib.h> //for system()
- #include "stack.h" //for SqStack
- //测试顺序栈的主程序
- int main()
- {
- SqStack s;
- int x;
- //输入若干正整数以0结束,依次入栈,然后依次出栈并打印
- InitStack(s);
- printf("输入若干正整数以0结束:");
- scanf("%d",&x);
- while(x!=0) {
- Push(s,x);
- scanf("%d",&x);
- }
- printf("\n出栈结果:");
- while(!StackEmpty(s)) {
- Pop(s,x);
- printf("%4d",x);
- }
- //-------------------------------------
- // TODO (#1#): 其它测试程序
- //-------------------------------------
- DestroyStack(s); //销毁栈
- system("PAUSE");
- return 0;
- }
链式实现
- #ifndef STACK_H_INCLUDED
- #define STACK_H_INCLUDED
- #include "ds.h" //for Status,OK ...
- #ifndef ElemType
- #define ElemType int /* 数据元素类型默认为 int */
- #define ELEMTYPE_TAG
- #endif
- ///
- //链栈的存储结构定义
- typedef struct LNode {
- ElemType data;
- struct LNode *next;
- } LNode, *LinkList;
- typedef LinkList LinkStack; //链栈类型
- ///
- //链栈的基本操作声明
- //构造一个空栈S
- Status InitStack(LinkStack &S);
- //销毁栈S
- Status DestroyStack(LinkStack &S);
- //将栈S清空
- Status ClearStack(LinkStack &S);
- //若栈S为空返回TRUE,否则FALSE
- Status StackEmpty(LinkStack S);
- //返回栈S中的元素个数
- int StackLength(LinkStack S);
- //用e返回栈顶元素
- // 前提:栈S存在且不空
- Status GetTop(LinkStack S, ElemType &e);
- //元素e入栈S
- Status Push(LinkStack &S, ElemType e);
- //S出栈用e返回出栈元素
- // 前提:栈S存在且不空
- Status Pop(LinkStack &S, ElemType &e);
- ///
- //链栈的基本操作的实现
- //构造一个空栈S
- Status InitStack(LinkStack &S)
- {
- // TODO (#1#): 构造一个空栈S,不带头结点
- S=(LinkStack)malloc(sizeof(LNode));
- if(!S) return ERROR;
- S->next=NULL;
- return OK;
- //-------------------------------------
- }
- //销毁栈S
- Status DestroyStack(LinkStack &S)
- {
- // TODO (#1#):销毁栈S,相当于清空栈
- LinkStack p;
- while(S)
- {
- p=S->next;
- free(S);
- S=p;
- }
- return OK;
- //-------------------------------------
- }
- //将栈S清空
- Status ClearStack(LinkStack &S)
- {
- // TODO (#1#): 将栈S清空,释放所有结点
- LinkStack p,q;
- p=S->next;
- while(p)
- {
- q=p->next;
- free(p);
- p=q;
- }
- S->next=NULL;
- return OK;
- //-------------------------------------
- }
- //若栈S为空返回TRUE,否则FALSE
- Status StackEmpty(LinkStack S)
- {
- // TODO (#1#): 若栈S为空返回TRUE,否则FALSE
- if(S==NULL)
- return 1;
- else
- return 0;
- //-------------------------------------
- }
- //返回栈S中的元素个数
- int StackLength(LinkStack S)
- {
- // TODO (#1#): 返回栈S中的元素个数
- LinkStack p;
- int x=0;
- p=S->next;
- while(p!=NULL)
- {
- x++;
- pp=p->next;
- }
- return x;
- //-------------------------------------
- }
- //用e返回栈顶元素
- // 前提:栈S存在且不空
- Status GetTop(LinkStack S, ElemType &e)
- {
- // TODO (#1#):若栈S不空,则用e返回栈顶元素
- if(S==NULL) exit(OVERFLOW);
- e=S->data;
- return OK;
- //-------------------------------------
- }
- //元素e入栈S
- Status Push(LinkStack &S, ElemType e)
- {
- // TODO (#1#): 插入元素e作为新的栈顶
- LinkStack p;
- p=(LinkStack)malloc(sizeof(LNode));
- if(!p)exit(OVERFLOW);
- p->data=e;
- p->next=NULL;
- p->next=S->next;
- S->next=p;
- return OK;
- //-------------------------------------
- }
- //S出栈用e返回出栈元素
- // 前提:栈S存在且不空
- Status Pop(LinkStack &S, ElemType &e)
- {
- // TODO (#1#):若栈S不空,则删除栈顶元素用e返回
- if(S==NULL) return ERROR;
- e=S->data;
- SS=S->next;
- return OK;
- //-------------------------------------
- }
- #ifdef ELEMTYPE_TAG
- #undef ElemType
- #undef ELEMTYPE_TAG
- #endif
- #endif
- #include <stdio.h>
- #include <stdlib.h> //for system()
- #include "stack.h" //链栈
- //测试链栈的主程序
- int main()
- {
- LinkStack s;
- int x;
- //输入若干正整数以0结束,依次入栈,然后依次出栈并打印
- InitStack(s);
- printf("输入若干正整数以0结束:");
- scanf("%d",&x);
- while(x!=0) {
- Push(s,x);
- scanf("%d",&x);
- }
- printf("\n出栈结果:");
- while(!StackEmpty(s)) {
- Pop(s,x);
- printf("%4d",x);
- }
- //-------------------------------------
- // TODO (#1#): 其它测试程序
- //-------------------------------------
- DestroyStack(s); //销毁栈
- system("PAUSE");
- return 0;
- }