数据结构-stack基本操作

来源:互联网 发布:大承网络 编辑:程序博客网 时间:2024/05/21 14:00


三个文件:stack.h,stack.cpp,main.cpp


stack.h

#include "stdio.h"#include <stdlib.h>#include <malloc.h>#include <string.h>#define Status int#define SElemType int#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OVERFLOW 0#define ERROR 0#define OK 1//typedef struct{        SElemType *base;        //指向栈尾        SElemType *top;         //指向栈顶        int stacksize;          //记录栈元素个数}SqStack;//////栈的基本操作////初始化栈Status InitStack(SqStack &S);//返回1,表示成功;返回0表示不成功//判栈满Status IsFull(SqStack &S);//判栈空Status IsEmpty(SqStack &S);//如空,返回1;非空返回0//入栈Status Push(SqStack &S,SElemType e);//出栈Status Pop(SqStack &S,SElemType &e);//显示栈元素Status StackTraverse(SqStack &S);//访问栈顶Status GetTop(SqStack &S,SElemType &e);//求栈长度int StackLength(SqStack &S);//清空栈Status ClearStack(SqStack &S);//销毁栈Status DestroyStack(SqStack &S);

stack.cpp

#include "stack.h"#include "stdio.h"#include <stdlib.h>#include <malloc.h>#include <iostream>using namespace std;//栈的基本操作//////初始化栈Status InitStack(SqStack &S){       //构造一个空栈        S.base =(SElemType*)malloc(STACK_INIT_SIZE * sizeof(SElemType));        if(!S.base) return(OVERFLOW);        S.top=S.base;        S.stacksize=STACK_INIT_SIZE;        return OK;}//判栈满Status IsFull(SqStack &S){//若满返回1,否则返回0if((S.top-S.base)>= S.stacksize) //若栈满{//cout<<"栈满"<<endl;return 1;}else return 0;}//判空Status IsEmpty(SqStack &S){//若栈空返回1,否则返回0if(S.top==S.base) {//cout<<"栈空"<<endl;return 1;}else return 0;}//入栈Status Push(SqStack &S,SElemType e){//将e插入栈顶//判满,加空间if( IsFull(S)==1) {S.base=(SElemType*)realloc(S.base,(S.stacksize + STACKINCREMENT)*sizeof(SElemType));if(S.base==NULL) return(OVERFLOW);S.top=S.base + S.stacksize;//top指针移动到新位置S.stacksize=S.stacksize + STACKINCREMENT;//栈空间扩容}*S.top=e;//栈顶元素赋值S.top++;//top指针上移//入栈return 0;}//出栈Status Pop(SqStack &S,SElemType &e){//弹出栈顶元素,并用e接收//判空if(IsEmpty(S)==1) return(ERROR);//弹出S.top--;e=*S.top;//等价于e= *(--top)return OK;}//显示栈中元素Status StackTraverse(SqStack &S){//cout<<"遍历栈元素"<<endl;SElemType *p;p=S.base;while(p!=S.top){cout<<*p<<" ";p++;}cout<<endl;cout<<"遍历完毕!"<<endl;return 0;}//取栈顶元素Status GetTop(SqStack &S,SElemType &e){//若栈空返回ERROR,否则返回1if(IsEmpty(S)==1) return ERROR;S.top--;e=*S.top;return OK;}//求长度int StackLength(SqStack &S){return S.top-S.base;}//清空栈Status ClearStack(SqStack &S){S.top=S.base;//cout<<"已清空栈"<<endl;return OK;}//销毁栈Status DestroyStack(SqStack &S){free(S.base);S.top=NULL;S.base=NULL;S.stacksize=0;cout<<"已销毁栈"<<endl;return OK;}

main.cpp

#include <iostream>#include "stack.h"using namespace std;int main(){/*        SqStack sta;        InitStack(sta);cout<<IsEmpty(sta)<<endl;Push(sta,'a');Push(sta,'b');Push(sta,'c');Push(sta,'d');cout<<"栈长度为:"<<StackLength(sta)<<endl;StackTraverse(sta);cout<<IsEmpty(sta)<<endl;SElemType e;Pop(sta,e);cout<<"栈长度为:"<<StackLength(sta)<<endl;cout<<"e="<<e<<endl;StackTraverse(sta);GetTop(sta,e);cout<<"e="<<e<<endl;cout<<"栈长度为:"<<StackLength(sta)<<endl;ClearStack(sta);cout<<"栈长度为:"<<StackLength(sta)<<endl;Push(sta,'a');Push(sta,'b');Push(sta,'c');Push(sta,'d');StackTraverse(sta);cout<<"栈长度为:"<<StackLength(sta)<<endl;DestroyStack(sta);//cout<<"栈长度为:"<<StackLength(sta)<<endl;*//*//需求:将一个十进制转换为二进制void conversion();conversion();//cout<<"栈长度为:"<<StackLength(sta)<<endl;*///需求:行编程程序/*void LineEdit();LineEdit();*///需求:后缀表达式求值 3 4 + 5 * 7 / char str[100];fgets(str,100,stdin);//从标准 输入获取字符串int res=0;int ReverseCal(char *);//函数声明res=ReverseCal(str);//函数调用cout<<"res="<<res<<endl;system("pause");        return (0);}int Precede(char* c1,char* c2){   //大于返回1,小于返回-1,等于返回0     if(*c1=='*')    {      if(*c2=='+') return 1;      if(*c2=='-') return 1;      if(*c2=='*') return 0;      if(*c2=='/') return 0;    }        if(*c1=='/')    {      if(*c2=='+') return 1;      if(*c2=='-') return 1;      if(*c2=='*') return 0;      if(*c2=='/') return 0;    }            if(*c1=='+')    {      if(*c2=='+') return 0;      if(*c2=='-') return 0;      if(*c2=='*') return -1;      if(*c2=='/') return -1;    }            if(*c1=='-')    {      if(*c2=='+') return 0;      if(*c2=='-') return 0;      if(*c2=='*') return -1;      if(*c2=='/') return -1;    }}char* InffixToSuffix(char *s){//将中缀表达式转换为后缀表达式SqStack OPTR;//操作符栈SqStack OPND;//操作数栈InitStack(OPTR);InitStack(OPND);Push(OPTR,'#');char *p=s;while(*p!='\0'){switch(*p){//如果不是运算符(是数字),入栈//如果是运算符,比较符合栈的操作符,再做}p++;}return s;}int ReverseCal(char *s){//逆波兰式计算器SqStack sta;InitStack(sta);//初始化话一个栈结构int res;int a,b;char *p=s;p=strtok(s," ");//分解字符串Push(sta,atoi(p));//atoi()函数将字符串转换为intwhile( (p=strtok(NULL," ")) !='\0'){switch(*p){case '+':Pop(sta,b);Pop(sta,a);res = a+b;Push(sta,res);//将结果入栈break;case '-':Pop(sta,b);Pop(sta,a);res = a-b;Push(sta,res);break;case '*':Pop(sta,b);Pop(sta,a);res = a*b;Push(sta,res);break;case '/':Pop(sta,b);Pop(sta,a);res = a/b;Push(sta,res);break;default: Push(sta,atoi(p));//如果获取数字直接入栈}}return res;}/*void LineEdit(){//行编辑函数cout<<"请输入字符:"<<endl;SqStack sta;InitStack(sta);//初始化话一个栈结构char ch,e;ch=getchar();//cout<<ch;while(ch!=EOF && ch!='\n'){switch(ch){case '#': Pop(sta,e);//若输入#,回退一格break;case '@': ClearStack(sta);//若输入@,回退一行break;default: Push(sta,ch);break;}ch=getchar();}StackTraverse(sta);//遍历栈元素DestroyStack(sta);//销毁栈}//行编辑函数*/void conversion(){//进制转换程序int N;cout<<"请输入一个正整数:"<<endl;cin>>N;SqStack sta;InitStack(sta);while(N!=0){Push(sta,N%2);//求余N=N/2;//整除}//StackTraverse(sta);cout<<"对应的二进制为:"<<endl;while(IsEmpty(sta)!=1){SElemType e;Pop(sta,e);cout<<e<<" ";}cout<<endl;}



1 0