顺序栈和链栈的基本操作

来源:互联网 发布:辅助软件是什么意思 编辑:程序博客网 时间:2024/05/22 11:50

SqStack.h

//**********一些预定义常量和类型***********#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2 typedef int Status;//**********栈的顺序存储表示***************#define STACK_INIT_SIZE 100#define STACKINCREMENT 10typedef int SElemType;typedef struct{  SElemType *base;  SElemType *top;  int stacksize;}SqStack;//**********基本操作的函数原型说明**********Status InitStack(SqStack *S);//构造一个空栈SStatus DestroyStack(SqStack *S);//销毁栈S,S不再存在Status ClearStack(SqStack *S);//把S置为空栈Status StackEmpty(SqStack S);//若栈S为空栈,则返回TRUE,否则返回FALSEint StackLength(SqStack S);//返回S的元素个数,即栈的长度Status GetTop(SqStack S,SElemType *e);//若栈不空,则用*e返回S的栈顶元素,并返回OK;否则返回ERRORStatus Push(SqStack *S,SElemType e);//插入e为新的栈顶元素Status Pop(SqStack *S,SElemType *e);//若栈不空,则删除S的栈顶元素,用*e返回其值,并返回OK;否则返回ERROEStatus StackTraverse(SqStack S);//从栈顶到栈底遍历栈//**********基本操作的算法描述部分************//初始化Status InitStack(SqStack *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;}//销毁Status DestroyStack(SqStack *S){  int i;  for(i=1;i<=S->stacksize;i++)    free(S->base++);  S->base=S->top=NULL;  S->stacksize=0;  return OK;}//置空Status ClearStack(SqStack *S){  S->top=S->base;  return OK;}//判空Status StackEmpty(SqStack S){  if(S.top==S.base)    return TRUE;  else    return FALSE;}//测长度int StackLength(SqStack S){  return S.top-S.base;}//取栈顶元素Status GetTop(SqStack S,SElemType *e){  if(S.top==S.base) return ERROR;  *e=*(S.top-1);  return OK;}//入栈Status Push(SqStack *S,SElemType 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;}//出栈Status Pop(SqStack *S,SElemType *e){  if(S->top==S->base) return ERROR;  *e=*--S->top;  return OK;}//遍历Status StackTraverse(SqStack S){  if(StackEmpty(S)) printf("此时栈为空栈!\n");  for(S.top--;S.top>S.base;S.top--)    printf("%d ",*S.top);  printf("%d\n",*S.top);  return OK;}

LinkStack.h

//**********一些预定义常量和类型***********#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1#define OVERFLOW -2 typedef int Status;//**********栈的链式存储表示***************//没有头结点typedef int SElemType;//结点结构typedef struct StackNode{  SElemType data;  struct StackNode *next;}StackNode;//链栈结构typedef struct LinkStack{  struct StackNode *top;  int count;}LinkStack;//**********基本操作的函数原型说明**********Status InitStack(LinkStack *S);//构造一个空栈SStatus DestroyStack(LinkStack *S);//销毁栈S,S不再存在Status ClearStack(LinkStack *S);//把S置为空栈Status StackEmpty(LinkStack S);//若栈S为空栈,则返回TRUE,否则返回FALSEint StackLength(LinkStack S);//返回S的元素个数,即栈的长度Status GetTop(LinkStack S,SElemType *e);//若栈不空,则用*e返回S的栈顶元素,并返回OK;否则返回ERRORStatus Push(LinkStack *S,SElemType e);//插入e为新的栈顶元素Status Pop(LinkStack *S,SElemType *e);//若栈不空,则删除S的栈顶元素,用*e返回其值,并返回OK;否则返回ERROEStatus StackTraverse(LinkStack S);//从栈顶到栈底遍历栈//**********基本操作的算法描述部分************//初始化Status InitStack(LinkStack *S){  S->top=NULL;  S->count=0;  return OK;}//销毁Status DestroyStack(LinkStack *S){  StackNode *p=S->top;  for(S->count;S->count>0;S->count--)  {    S->top=p->next;free(p);p=S->top;  }  S->count=0;  return OK;}//置空Status ClearStack(LinkStack *S){  S->top=NULL;  S->count=0;  return OK;}//判空Status StackEmpty(LinkStack S){  if(!S.count)    return TRUE;  else    return ERROR;}//测长度int StackLength(LinkStack S){  return S.count;}//取栈顶元素Status GetTop(LinkStack S,SElemType *e){  if(!S.count) return ERROR;  *e=S.top->data;  return OK;}//入栈Status Push(LinkStack *S,SElemType e){  StackNode *p=(StackNode *)malloc(sizeof(StackNode));  p->data=e;  p->next=S->top;  S->top=p;  S->count++;  return OK;}//出栈Status Pop(LinkStack *S,SElemType *e){  if(!S->count)    return ERROR;  StackNode *p=S->top;  *e=S->top->data;  S->top=p->next;  free(p);  S->count--;  return OK;}//遍历Status StackTraverse(LinkStack S){  while(S.top)  {    printf("%d ",S.top->data);S.top=S.top->next;  }  return OK;}



 

主函数文件

#include<stdio.h>#include<stdlib.h>#include"SqStack.h"#include"LinkStack.h"int main(){  SqStack Q;//LinkStack Q;  SElemType x,y;  int number;do  {    printf("\n\n\t主菜单\n\n");printf("%3c1%4c初始化\n",' ',' ');printf("%3c2%4c销毁\n",' ',' ');printf("%3c3%4c置空\n",' ',' ');printf("%3c4%4c判空\n",' ',' ');printf("%3c5%4c测长度\n",' ',' ');printf("%3c6%4c取栈顶元素\n",' ',' ');printf("%3c7%4c入栈\n",' ',' ');printf("%3c8%4c出栈\n",' ',' ');printf("%3c9%4c遍历\n\n",' ',' ');printf("请输入您的选择(1-8):");scanf("%d",&number);//第一次输入必须为1,即必须初始化switch(number){  case 1:  {    InitStack(&Q);printf("栈已初始化,此时栈为空栈!\n");break;  }  case 2:  {    DestroyStack(&Q);printf("栈已销毁,此时栈不存在!\n");break;  }  case 3:  {    ClearStack(&Q);printf("栈已被置空,此时栈为空栈!\n");break;  }  case 4:  {    if(StackEmpty(Q)){printf("此时栈为空栈!\n");break;}else{printf("此时栈不是空栈!\n");break;}  }  case 5:  {    printf("栈的长度为%d\n",StackLength(Q));break;  }  case 6:  {    GetTop(Q,&x);printf("此时栈顶元素为:%d\n",x);break;  }  case 7:  {    printf("请输入入栈元素:");scanf("%d",&y);    Push(&Q,y);printf("此时从栈顶到栈底遍历栈,得到如下序列:\n");StackTraverse(Q);break;  }  case 8:  {    Pop(&Q,&x);printf("出栈元素为:%d\n",x);printf("此时从栈顶到栈底遍历栈,得到如下序列:\n");StackTraverse(Q);break;  }  case 9:  {    printf("此时从栈顶到栈底遍历栈,得到如下序列:\n");StackTraverse(Q);break;  }}  }while(number<=9);  return 0;}




注:1、参考严蔚敏版教材

       2、vc6.0环境下运行(顺序栈销毁时出错,暂未找到错误)

       3、遍历为从栈顶到栈底遍历

0 0
原创粉丝点击