加载中…
个人资料
___尛洛
___尛洛
  • 博客等级:
  • 博客积分:0
  • 博客访问:537
  • 关注人气:5
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

栈的抽象数据类型定义

(2011-03-27 15:10:33)
标签:

数据元素

宋体

抽象数据类型

杂谈

分类: 数据结构

ADT Stack{

数据对象:D={ai|ai∈ElemSet, i=1,2, …,n, n≥0}

数据关系:R1={<ai-1,ai>|ai-1,ai∈D, i=1,2, …,n }

           约定an端为栈顶,a1端为栈底。

基本操作:

   InitStack( &S )

     操作结果:构造一个空栈S。

   DestroyStack ( &S )

     初始条件:栈S已存在。

     操作结果:销毁栈S。

   ClearStack( &S )

     初始条件:栈S已存在。

     操作结果:将S清为空栈。

   StackEmpty( S )

     初始条件:栈S已存在。

     操作结果:若S为空栈,则返回TRUE,否则返回FALSE。

   StackLength( S )

     初始条件:栈S已存在。

     操作结果:返回S的数据元素个数,即栈的长度。

   GetTop( S, &e )

     初始条件:栈S已存在且非空。

     操作结果:用e返回S的栈顶元素。

   Push( &S, e )

     初始条件:栈S已存在。

     操作结果:插入元素e为新的栈顶元素。

   Pop( &S, &e )

     初始条件:栈S已存在且非空。

     操作结果:删除S的栈顶元素,并用e返回其值。

   StackTraverse( S, visit() )

     初始条件:栈S已存在且非空。

     操作结果:从栈底到栈顶依次对S的每个数据元素调用函数visit()。一旦visit()失败,则操作失败。

}ADT Stack
#include<stdio.h>
#include<malloc.h>
#define STACK_INIT_SIZE 1
#define STACKINCREMENT 10
typedef char ElemType;
struct SqStack
{
     ElemType *elem;
     ElemType   *top;
     int stacksize;
};
int InitStack(struct SqStack *S)
{
     S->elem=(ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
     if(!S->elem)
     {
         printf("初始化栈失败"); 
         return 0;
     }
     else
     {
         S->top=S->elem;
         S->stacksize= STACK_INIT_SIZE;
         printf("初始化栈成功\n");
         return 1;
     }
}
int Push(struct SqStack *S,ElemType x)
{
      if(S->top-S->elem>=S->stacksize)
      {
         S->elem=(ElemType *)realloc(S->elem,(S->stacksize+STACKINCREMENT) * sizeof(ElemType));
         if(!S->elem)
             printf("开辟空间失败\n");
              return 0;
         }
          else
          {
             S->top=S->elem+S->stacksize;
             S->stacksize+=STACKINCREMENT;
          }
     }
     *S->top=x;
     S->top++;
     return x;
}
int Pop(struct SqStack *S,ElemType x)
{
     if(S->top==S->elem)
     {
         printf("栈空\n");
         return 0;
     }
     else
      
         S->top--;
         x=*S->top;
         return x;
     }
}
int GetTop(struct SqStack *S,ElemType x)
{
     if(S->top==S->elem)
     {
         printf("栈空\n");

7楼

         return 0;
     }
     else
     {
         x=*(S->top-1);

         return x;
     }
}
int StackLength(struct SqStack *S)
{
     int n;
     n=S->top-S->elem;
     return(n);
}
void StackEmpty(struct SqStack *S)
{
     if(S->top==S->elem)
    
         printf("栈为空\n");
     else
         printf("栈不为空\n");
}
int VisitStack(struct SqStack *S)
{
     int k=0;
     while(S->top!=S->elem)
     {
         --S->top;
         k++;
         printf("%c ",*S->top);
     }
         S->top+=k;
         return 1;
}
int ClearStack(struct SqStack *S)
{
   if(S->top==S->elem)
       return 0;
   else
    S->top=S->elem;
      return 1;
   }

}
int DestoryStack(struct SqStack *S)
{
     free(S->elem);
     S->elem=NULL;
     S->top=NULL;
     S->stacksize=0;
     return 1;
}

void main()
    int y;
     struct SqStack A;
     ElemType x=0;
     ElemType e;
     int cmd;
     printf("*******************************************************************************\n");
     printf("1-初始化栈      2-进栈         3-取栈顶元素       4-求栈长     5-销毁栈\n");
     printf("6-判空          7-遍历栈       8-出栈             9-清空栈     0-退出\n");
     printf("*******************************************************************************\n");
  
do{     printf("enter your choice ");
     scanf("%d",&cmd);
      e=getchar();
     switch(cmd)
     {
case 1:   InitStack(&A);
              break;
     case 2:   printf("e=");
              e=getchar();
              y=Push(&A,e);printf("进栈元素为>>%c\n",y);
              break;
     case 3:   y=GetTop(&A,x);
              if(!y)
              printf("没有栈顶元素>>\n");
              else
              printf("栈顶元素为>>%c\n",y);break;
     case 4:   y=StackLength(&A);
              printf("栈中元素个数为>>%d\n",y);break;
     case 5:   if(DestoryStack(&A));
              printf("栈销毁成功>>\n");break;
     case 6:   StackEmpty(&A);break;
     case 7:   printf("出栈序列为>>");
              VisitStack(&A);
              printf("\n");
              break;
     case 8:   y=Pop(&A,x);
              if(!y)
              printf("没有栈顶元素可出>>\n");
              else
              printf("出栈元素为>>%c\n",y);
               break;
     case 9:   y=ClearStack(&A);
              if(!y)
                  printf("栈本身为空>>\n");
              else 
                  printf("栈成功清空>>\n");
              break;
     default: break;
     }
}while(cmd!=0);
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有