包括三个文件: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,否则返回0 if((S.top-S.base)>= S.stacksize) //若栈满 { //cout<<"栈满"<<endl; return 1;} else return 0; } //判空 Status IsEmpty(SqStack &S) { //若栈空返回1,否则返回0 if(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,否则返回1 if(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()函数将字符串转换为int while( (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; }
时间: 2024-10-05 13:25:11