欢迎访问电子工程网!   登录 | 免费注册 ]   

旧雨新知9的个人空间 http://www.eechina.com/space-uid-41802.html [收藏] [复制] [分享] [RSS]

博客

顺序栈的各种基本运算

已有 527 次阅读2011-8-10 13:08

实验内容与要求:

 

编写一个程序,实现顺序栈的各种基本运算,并在基础上完成以下功能:

1)       初始化顺序栈;

2)       判断顺序栈是否为空;

3)       依次进栈元素a,b,c,d,e

4)       判断顺序栈是否为空;

5)       输出栈长度;

6)       输出从栈顶到栈底的元素;

7)       读出栈顶元素;

8)       删除栈顶元素;

9)       输出从栈顶到栈底的元素;

10)    判断顺序栈是否为空;

11)    释放栈。

 

 

代码如下:

 

#include<stdio.h>

#include<malloc.h>

#include<stdlib.h>

 

#define TRUE  1

#define FALSE 0

#define OK 1

#define ERROR 0

#define NULL  0

#define OVERFLOW -2

 

typedef int Status;

typedef char SElemType;

Status visit(SElemType e);

 

#define STACK_INIT_SIZE  100  // 栈存储空间的初始分配量

#define STACKINCREMENT  10    // 存储空间分配增量

typedef struct {

   SElemType  *base;            // 存储数据元素的数组

   SElemType  *top;             // 栈顶指针

   int stacksize;               // 当前分配的栈空间大小,sizeof(SElemType)为单位

}SqStack;

 

Status InitStack (SqStack &S) {

       // 构造一个空栈S

       S.base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));

       if (!S.base) exit (OVERFLOW);

       S.top = S.base;

       S.stacksize = STACK_INIT_SIZE;

       return OK;

}// InitStack

 

Status DestroyStack (SqStack &S) {

       // 销毁栈S

       free(S.base);

       S.base=NULL;

       S.top=NULL;

       S.stacksize=0;

       return OK;

}// DestroyStack

 

Status StackEmpty (SqStack S) {

       // 判断栈S是否为空

       if(S.top==S.base)

              return TRUE;

       else

              return FALSE;

}// StackEmpty

 

Status Push (SqStack &S, SElemType e) {

       // 插入元素e为新的栈顶元素

       if (S.top - S.base >= S.stacksize) {

              // 栈满,追加存储空间

              S.base = (SElemType *) realloc(S.base,

                     (S.stacksize + STACKINCREMENT) * sizeof (SElemType));

              if (!S.base) exit (OVERFLOW);  //存储分配失败

              S.top = S.base + S.stacksize;

              S.stacksize += STACKINCREMENT;

       }

       *S.top++ = e;

       return OK;

}// Push

 

int StackLength (SqStack S) {

       // 返回S的元素个数,即栈的长度

       return S.top-S.base;

}// StackLength

 

Status GetTop (SqStack S, SElemType &e) {

       // 若栈不空,则用e返回S的栈顶元素

       if(S.top==S.base)  return ERROR;

       e = *(S.top-1);

       return OK;

}// GetTop

 

Status Pop (SqStack &S, SElemType &e) {

       // 若栈不空,则删除S的栈顶元素

       if(S.top==S.base)  return ERROR;

       e= * --S.top;

       return OK;

}// Pop

 

Status StackTraverse (SqStack S, Status( *visit)(SElemType)) {

       // 遍历栈

       while(S.top!=S.base)

    visit(*--S.top);

    return OK;

}// StackTraverse

 

void main() {

       // 主函数

       SElemType e;

       SqStack S;

       printf("(1)初始化顺序栈。\n");

       InitStack(S);

       printf("(2)判断顺序栈是否为空:\n");

       StackEmpty(S);

       printf("(3)依次进栈元素a,b,c,d,e:\n");

       Push(S,'a');

       Push(S,'b');

       Push(S,'c');

       Push(S,'d');

       Push(S,'e');

       printf("(4)判断顺序栈是否为空:\n");

       StackEmpty(S);

       printf("(5)输出栈长度:%d\n",StackLength(S));

       printf("(6)输出从栈顶到栈底的元素:\n");

       StackTraverse(S,visit);

       printf("(7)读出栈顶元素:%d\n",GetTop(S,e));

       printf("(8)删除栈顶元素:%d\n",Pop(S,e));

       printf("(9)输出从栈顶到栈底的元素:\n");

       StackTraverse(S,visit);

       printf("(10)判断顺序栈是否为空\n");

       StackEmpty(S);

       printf("(11)释放栈。");

       DestroyStack(S);

}


路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 立即注册

回顶部