数据结构栈的数组实现初始化,入栈,出栈,获取栈顶元素,栈的长度等操作

来源:互联网 发布:c string数组添加元素 编辑:程序博客网 时间:2024/05/03 06:54
#ifndef _STACK_H#define _STACK_H#define OK 1#define ERROR 0 #define OVERFLOW -2 #define STACK_INIT_SIZE 100  //栈初始化分配量#define STACKINCREMENT 10    //存储空间的分配增量typedef int SElemType  ;typedef int Status ;typedef struct {SElemType *base ;SElemType *top ;int stacksize ;}SqStack;//------基本操作----------Status InitStack(SqStack &s); //初始化栈Status DestoryStack(SqStack &s);//销毁栈Status ClearStack(SqStack &s);//清空栈Status StackEmpty(SqStack s); //判断栈是否为空int StackLength(SqStack s);//栈的长度Status GetTop(SqStack s, SElemType &e);//获取栈顶元素Status Push(SqStack &s, SElemType e); //入栈Status Pop(SqStack &s , SElemType &e);//出栈Status StackTraverse(SqStack s, Status(*visit)());//void Display(SqStack s);#endif

具体实现:

#include <stdio.h>#include <stdlib.h>#include "stack.h"/**********************************************        初始化栈**********************************************/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 GetTop(SqStack s, SElemType &e){//判断栈是否为空,若为空则返回errorif(s.base==s.top)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){//出栈首先要判断栈是否为空,若为空则返回errorif(s.top==s.base) return ERROR ;e = *(--s.top);    //先减后取return OK ;}/**********************************************        //销毁栈**********************************************/Status DestoryStack(SqStack &s){free(s.base);      s.base = NULL;      s.top = NULL;      s.stacksize = 0;  return OK ;}/**********************************************        //清空栈**********************************************/Status ClearStack(SqStack &s){if(s.base==s.top) {printf("栈已空");return 1 ;}else{s.top = s.base ;}return OK ;}/**********************************************        //判断栈是否为空**********************************************/Status StackEmpty(SqStack s){if(s.top==s.base)    return OK ;return ERROR ;}/**********************************************        //栈的长度**********************************************/int StackLength(SqStack s){int length =0;if(s.top==s.base) return 0 ;while(s.top!=s.base){length++ ;s.top-- ; //栈顶指针移动}return length ;}/**********************************************       遍历栈元素**********************************************/void Display(SqStack s){while(s.base!=s.top){printf("%d\t", *(--s.top));}printf("\n");}

主函数:

void main(){SqStack s ;/*初始化*/if(InitStack(s))printf("初始化成功\n");printf("初始栈为空 = %d \n" , StackEmpty(s));printf("初始化时栈的长度=  %d\n",StackLength(s));    /*入栈*/printf("for init stack :\n ");for(int i=0;i<5;i++){Push(s,i);}printf("入栈后不为空 = %d \n" , StackEmpty(s));printf("入栈的后长度=%d\n",StackLength(s));Display(s);/*出栈*/int e ;Pop(s,e);printf("出栈的栈顶元素为= %d\n", e);printf("after Pop......\n");printf("出栈的后长度=  %d\n",StackLength(s));Display(s);/*获取栈顶元素*/int f ;GetTop(s,f);printf("栈顶元素为= %d\n", f);Display(s);/*清空栈*/ClearStack(s);printf("栈已清空\n");Display(s);}

栈的应用

1.数制转换

//1.数制转换 10-->2,8,16进制void Conversion(SqStack s){int N ,e ;printf("Input N:");scanf("%d",&N);while(N){//进制转化,若十进制-->二进制,则N%/2,N=N/2 ,转八进制,则N%8,N=N/8Push(s,N%16);N = N/16 ;}while(!StackEmpty(s)){Pop(s,e) ;printf("%d" , e);}}

2.括号匹配(注意使用下面程序要结合上面的程序,并且把SElemType 改成为char类型)

Status Matcher(SqStack s, char *p){SElemType e ;while(*p){switch (*p)          {          case '{':          case '[':          case '(': Push(s,*p++);break;//只要是左括号就入栈          case '}':          case ']':          case ')':Pop(s,e);  //只要是右括号就出栈                 if ((e=='{' && *p=='}') ||(e=='[' && *p==']') || (e=='(' && *p==')'))//比较出栈是否相等   p++;                   else { printf("括号不匹配!\n"); exit(ERROR); }                   break;          default :p++;//其他字符就后移          }  }if (StackEmpty(s))        printf("括号匹配成功");      else        printf("缺少右括号!");      printf("\n");  return OK;}
测试代码
void main(){SqStack s;//初始化空栈      InitStack(s);  char ch[100];      printf("输一个含义有()[]{}的括号表达式:\n");  gets(ch);      Matcher(s, ch) ;}



0 0
原创粉丝点击