数据结构实验2---表达式求值(“栈”实现)
2013-02-21 15:02
232 查看
#include<iostream> #include<string> #include <sstream> #include<fstream> #define STACK_INIT_SIZE 100 #define INCREAMENT 100 #define ZUIDAWEISHU 10 #define ERROR 0 using namespace std; class YunSuanFu{//运算符类 char fuhao; int pri; public : char get_fuhao(){ return fuhao; } int get_pri(){ return pri; } void set_fuhao(char e){ fuhao = e; } void set_pri(int e){ pri = e; } YunSuanFu(char e){ fuhao = e; if(e == '(' || e == ')' || e == '#') pri = 0; if(e == '+' || e == '-') pri = 1; if(e == '*' || e == '/') pri = 2; } YunSuanFu(){//函数体为空 } }; typedef struct{//SqStack1 int * bottom; int * top; int stacksize; }SqStack1; typedef struct{//SqStack2 YunSuanFu * bottom; YunSuanFu * top; int stacksize; }SqStack2; bool createStack1(SqStack1 &s){//创建栈 int a[STACK_INIT_SIZE]; s.bottom = a; if(!s.bottom){ return false; } s.stacksize = STACK_INIT_SIZE; s.top = s.bottom; return true; } bool createStack2(SqStack2 &s){//创建栈 YunSuanFu a[STACK_INIT_SIZE]; s.bottom = a; if(!s.bottom){ return false; } s.stacksize = STACK_INIT_SIZE; s.top = s.bottom; return true; } bool isEmpty1(SqStack1 &s){//判空 return s.bottom == s.top ? true : false; } bool isEmpty2(SqStack2 &s){ return s.bottom == s.top ? true : false; } bool get_top1(SqStack1 &s1, int &e){//得到栈顶元素 if(s1.top == s1.bottom) return false; e = *(s1.top - 1); return true; } bool get_top2(SqStack2 &s2, YunSuanFu &e){ if(s2.top == s2.bottom) return false; e.set_fuhao((*(s2.top - 1)).get_fuhao()); e.set_pri((*(s2.top - 1)).get_pri()); return true; } bool push1(SqStack1 &s, int &e){//入栈 if((s.top - s.bottom ) >= s.stacksize){ int *newbase =(int*) realloc (s.bottom,(s.stacksize + INCREAMENT) * sizeof(int)); if(!newbase) return false; s.bottom = newbase; s.top = s.bottom + s.stacksize; s.stacksize += INCREAMENT; } *(s.top) = e; cout<<*(s.top)<<endl;//ceshi cout<<s.top<<endl;//ceshi ++(s.top); return true; } bool push2(SqStack2 &s, YunSuanFu &e){ if(s.top - s.bottom >= s.stacksize){ YunSuanFu* newbase =(YunSuanFu*) realloc (s.bottom,(s.stacksize + INCREAMENT) * (sizeof(char)+sizeof(int))); if(!newbase) return false; s.bottom = newbase; s.top = s.bottom + s.stacksize; s.stacksize += INCREAMENT; } (s.top)->set_fuhao(e.get_fuhao());//类不能直接赋值!!! (s.top)->set_pri(e.get_pri()); s.top++; return true; } bool pop1(SqStack1 &s, int &e){//出栈 if(s.top == s.bottom) return false; e = *(s.top - 1);//这里有错误 cout<< e<<endl;//ceshi cout<<s.top-1<<endl;//ceshi --s.top; return true; } bool pop2(SqStack2 &s, YunSuanFu & e){ if(s.top == s.bottom) return false; e.set_fuhao((*(s.top - 1)).get_fuhao()); e.set_pri((*(s.top - 1)).get_pri()); s.top--; return true; } void jisuan(SqStack1 &s1,SqStack2 & s2){//计算 int e1,e2; YunSuanFu e3; pop2(s2,e3); if(e3.get_fuhao() == '+'){ pop1(s1,e1); pop1(s1,e2); int jieguo = e2 + e1; push1(s1,jieguo); } if(e3.get_fuhao() == '-'){ int e1,e2; pop1(s1,e1); pop1(s1,e2); int jieguo = e2 - e1; push1(s1,jieguo); } if(e3.get_fuhao() == '*'){ int e1,e2; pop1(s1,e1); pop1(s1,e2); int jieguo = e2 * e1; push1(s1,jieguo); } if(e3.get_fuhao() == '/'){ int e1,e2; pop1(s1,e1); pop1(s1,e2); int jieguo = e2 / e1; push1(s1,jieguo); } } //还要定义一个合法性检验函数 void ceshi(){//测试函数 cout<<"进来了"<<endl; }//ceshi();//测试 void biaodashiqiuzhi(string lujing){//表达式求值 string wenjianlujing = lujing; SqStack1 s1; SqStack2 s2; createStack1(s1); createStack2(s2); ifstream in; in.open(wenjianlujing,ios::out); char t[ZUIDAWEISHU]; in>>t; static string shuzhizichuan = "";//后面用 for(int i = 0,count1 = 0; t[i] != '\0'; i++){ if(t[i] == '+' || t[i] == '-' || t[i] == '*' || t[i] == '/' || t[i] == '('|| t[i] == ')' || t[i] == '#'){ if(t[i] == '#'){//测试ok if(count1 == 0){ YunSuanFu yunsuanfu = YunSuanFu(t[i]); push2(s2,yunsuanfu); count1 = 1; }else{ YunSuanFu yunsuanfu1; do{ jisuan(s1,s2); get_top2(s2,yunsuanfu1); }while(yunsuanfu1.get_fuhao() != '#'); int e1; pop1(s1,e1); YunSuanFu e; pop2(s2,e); if(isEmpty2(s2) && isEmpty1(s1)){ cout<<"jieguoshi:"<<e1<<endl; }else{ return ERROR; } count1 = 0; } } if(t[i] == '('){ YunSuanFu yunsuanfu = YunSuanFu(t[i]); push2(s2,yunsuanfu); } if(t[i] == ')'){ YunSuanFu yunsuanfu1; do{ jisuan(s1,s2); get_top2(s2,yunsuanfu1); }while(yunsuanfu1.get_fuhao() != '('); YunSuanFu e; pop2(s2,e); } if(t[i] == '+' || t[i] == '-' || t[i] == '*' || t[i] == '/'){ YunSuanFu yunsuanfu = YunSuanFu(t[i]),yunsuanfu2; get_top2(s2,yunsuanfu2); if(yunsuanfu.get_pri() > yunsuanfu2.get_pri()){ push2(s2,yunsuanfu); }else{ YunSuanFu yunsuanfu1; do{ jisuan(s1,s2); get_top2(s2,yunsuanfu1); }while(yunsuanfu.get_pri() <= yunsuanfu1.get_pri()); push2(s2,yunsuanfu); } } }else{ shuzhizichuan = shuzhizichuan + t[i]; if(!(t[i + 1] == '+' || t[i + 1] == '-' || t[i + 1] == '*' || t[i + 1] == '/' || t[i + 1] == '('|| t[i + 1] == ')' || t[i + 1] == '#')){ continue; }else{ int shuzhi; stringstream ss; ss<<shuzhizichuan; ss>>shuzhi; push1(s1, shuzhi); shuzhizichuan = ""; } } } in.close(); } int main(){//主函数 // SqStack1 s1;//测试用 //SqStack2 s2; //createStack1(s1); //createStack2(s2); //int e1 = 3; //bool t2 = push1(s1,e1); //cout<<"s1.top: "<<*(s1.top - 1)<<endl; //cout<<t2<<endl; //bool t1 = isEmpty1(s1); //cout<<t1<<endl; //int e = 0; //bool t3 = pop1(s1,e); //bool t4 = isEmpty1(s1); //cout<<t3<<endl<<e<<endl; string lujing = "biaodashi.txt"; biaodashiqiuzhi(lujing); }
相关文章推荐
- 11、数据结构笔记之十一栈的应用之表达式求值实现
- 【数据结构】实验二:栈与队列的应用---表达式求值
- 数据结构实验:栈实现计算器(表达式计算)
- 数据结构课程设计-用栈实现表达式求值的方法详解
- 数据结构之——用C++实现算术表达式求值
- 数据结构之---C语言实现栈的表达式求值(表达式树)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- C++实现数据结构作业——表达式求值
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据结构之应用 "栈(Stack)" 实现: 解析算术表达式及计算求值 (C#/Java)
- 数据结构课程设计---------用栈来实现表达式求值
- 数据结构课程设计---------用栈来实现表达式求值
- 【数据结构实验】实验四 算术表达式求值(必做,设计性实验,2学时)
- 数据结构(java语言描述)链栈的使用——表达式求值
- 数据结构与算法-实验2-自定义栈,并实现push、pop、改栈顶元素、取栈顶元素
- 2133 数据结构实验之栈与队列三:后缀式求值
- 数据结构表达式求值有关问题
- 【数据结构实验】约瑟夫环的实现
- 数据结构之应用"栈(Stack)"实现: 解析算术表达式及计算
- 2133-数据结构实验之栈与队列三:后缀式求值