| 2 | 1/1 | 返回列表 |
| 查看: 646 | 回復(fù): 1 | ||
DemiAsh新蟲 (初入文壇)
|
[求助]
[數(shù)據(jù)結(jié)構(gòu)/C++]新人求助,表達(dá)式求值程序無法運(yùn)行
|
|
#pragma once //順序棧類定義 template <class T> class SqStack { private: T *base;//棧底指針 int top;//棧頂 int stacksize;//棧容量 public: SqStack(int m);//構(gòu)建函數(shù) ~SqStack() { delete[] base; top = 0; stacksize = 0; }//析構(gòu)函數(shù) void Push(T x);//入棧 T Pop();//出棧 T GetTop();//獲取棧頂元素 int StackEmpty();//測(cè)? void ClearStack();//清空棧 void StackTop();//返回棧頂指針 void StackTranverse();//顯示棧中元素 }; //順序棧類實(shí)現(xiàn) template <class T> SqStack<T>::SqStack(int m) { base = new T[m]; if (base == NULL) { cout << "棧創(chuàng)建失敗,退出!" << endl; exit(1); } stacksize = m; top = -1; } template <class T> void SqStack<T>: ush(T x){ if (top == stacksize - 1) throw "棧滿,無法入棧"; top++; base[top] = x; //cout<<"top:"<<top<<endl; } template <class T> T SqStack<T>: op(){ T x; if (top == -1) throw "?眨荒艹鰲"; x = base[top--]; //cout<<"top:"<<top<<endl; return x; } template <class T> T SqStack<T>::GetTop() { if (top == -1) throw "?眨瑮m敓o元素"; //cout<<"top:"<<top<<endl; return base[top]; } template <class T> int SqStack<T>::StackEmpty() { if (top == -1) return 1; else return 0; } template <class T> void SqStack<T>::ClearStack() { top = -1; } template <class T> void SqStack<T>::StackTop() {//返回棧頂指針 cout << "棧頂top= " << top; } template <class T> void SqStack<T>::StackTranverse() { int i = top; while (i >= 0) cout << base[i--] << '\t'; cout << endl; } //SqStack.h,堆棧的類 //下面是源程序代碼 #include<iostream> #include"process.h" #include"stdio.h" #include<string.h> #include<stdlib.h> #include"SqStack.h" using namespace std; char pause; char Precede(char t1,char t2) { char f; switch(t2) { case '+': case '-':if(t1=='('||t1=='=') f='<'; else f='>'; break; case '*': case '/':if(t1=='*'||t1=='/'||t1==')') f='>'; else f='<'; break; case '(':if(t1==')') { cout<<"ERROR1"<<endl; exit(0); } else f='<'; break; case ')':switch(t1) { case '(':f='='; break; case '=':cout<<"ERROR2"<<endl; exit(0); default: f='>'; } break; case '=':switch(t1) { case '=':f='='; break; case '(':cout<<"ERROR2"<<endl; exit(0); default: f='>'; } } return f; } bool IsOperator(char c) { switch(c) { case'+': case'-': case'*': case'/': case'(': case')': case'=':return true; default:return false; } } double Operate(double a,char theta,double b) { double c; switch(theta) { case'+':c=a+b; break; case'-':c=a-b; break; case'*':c=a*b; break; case'/':c=a/b; } return c; } double Val_Exp(char *exp) { SqStack<char> OP(20); SqStack<double> OD(20); char theta; double a,b,d; char c,x; char z[6]; int i; OP.Push('='); c=*exp++; x=OP.GetTop(); while(c!='='||x!='=') { if(IsOperator(c)) switch(Precede(x,c)) { case'<':OP.Push(c); c=*exp++; break; case'=':x=OP.Pop(); c=*exp++; break; case'>':theta=OP.Pop(); b=OD.Pop(); a=OD.Pop(); OD.Push(Operate(a,theta,b)); } else if(c>='0'&&c<='9'||c=='.') { i=0; do { z=c; i++; c=*exp++; }while(c>='0'&&c<='9'||c=='.'); z='\0'; d=atof(z); OD.Push(d); } else { cout<<"ERROR3"<<endl;; exit(0); } x=OP.GetTop(); } d=OD.GetTop(); return d; } void CreatePostExp(char * exp,char * &postexp) { char c,x; int i=0; SqStack<char> OP(20); OP.Push('='); cout<<"exp:"<<exp<<endl; c=*exp++; while(c) { if((c>='0'&&c<='9')||c=='.') { postexp[i++]=c; c=*exp++; } if(IsOperator(c)) { postexp[i++]=' '; x=OP.GetTop(); switch(Precede(x,c)) { case'<':OP.Push(c); c=*exp++; break; case'=':x=OP.Pop(); c=*exp++; break; case'>':postexp[i++]=OP.Pop(); break; } } postexp='\0'; } cout<<"后綴表達(dá)式為:"<<postexp<<endl; } double Val_PostExp(char *postexp) { int i; char z[6]; double v=0,d=0,a,b; char c; SqStack<double> OD(20); c=*postexp++; while(c!='\0') { if((c>='0'&&c<='9')||c=='.') { i=0; do { z[i++]=c; c=*postexp++; }while(c>='0'&&c<='9'||c=='.'); z='\0'; d=atof(z); OD.Push(d); } if(IsOperator(c)) { b=OD.Pop (); a=OD.Pop (); OD.Push (Operate(a,c,b)); c=*postexp++; } c=*postexp++; } v=OD.Pop (); return v; } void CreatePreFax(char *exp, char *&prefax) { char q; char m[20]; int i, j, k; i = j = k = 0; SqStack<char> OP(20); SqStack<char> OM(20); SqStack<char> ON(20); while (*exp != '=') OM.Push(*exp++); while (!OM.StackEmpty()) { q = OM.Pop(); if ((q >= '0'&&q <= '9') || q == '.') { m[i++] = q; } if (q == ')') OP.Push(q); while ((q == '+') || (q == '-') || (q == '*') || (q == '/')) { m[i++] = ' '; if (OP.StackEmpty() || OP.GetTop() == ')' || Precede(q, OP.GetTop()) == '>' || Precede(q, OP.GetTop() )== '=') { OP.Push(q); break; } else m[i++] = OP.Pop(); } if (q == '(') { while (OP.GetTop() != ')') m[i++] = OP.Pop(); OP.Pop(); } } while (!OP.StackEmpty()) { m[i++] = OP.Pop(); } m = '\0'; while (m[j] != '\0') { ON.Push(m[j++]); } while (!ON.StackEmpty()) prefax[k++] = ON.Pop(); prefax[k] = '\0'; cout << "前綴表達(dá)式為:" << prefax << endl; } double Val_PreFax(char *prefax) { int i, j; char c; char z[6]; char s[6]; SqStack<char>OS(20); SqStack<double>OD(20); double v = 0, d = 0, a, b; while (*prefax != '\0') { OS.Push(*prefax++); } while (!OS.StackEmpty()) { c = OS.Pop(); if ((c>='0'&&c<='9')||c=='.') { i = 0; do { z[i++] = c; c = OS.Pop(); } while ((c>='0'&&c<='9')||c=='.'); i--; for (int j = 0; i >= 0; i--) s[j++] = z; s = '\0'; d = atof(s); OD.Push(d); } if (IsOperator(c)) { b = OD.Pop(); a = OD.Pop(); OD.Push(Operate(b,c,a)); } } v = OD.Pop(); return v; } int main(void) { char exp[20]="(2.2+5)+4*(5-3.1)="; char *postexp; postexp=new char[20]; *postexp='\0'; char *prefax; prefax = new char[20]; *prefax = '\0'; double v1, v2; system("cls" ;int choice; do { cout<<"主菜單\n"; cout<<"1-創(chuàng)建表達(dá)式\n"; cout<<"2-表達(dá)式求值\n"; cout<<"3-求后綴表達(dá)式\n"; cout<<"4-后綴表達(dá)式求值\n"; cout<<"5-求前綴表達(dá)式\n"; cout << "6-前綴表達(dá)式求值\n"; cout << "7-顯示表達(dá)式\n"; cout<<"8-退出\n"; cout<<"Enter choice:"; cin>>choice; switch(choice) { case 1: cout<<"請(qǐng)輸入表達(dá)式,以=結(jié)束"<<endl; cin>>exp; cin.get(pause); system("pause" ;break; case 2: v1=Val_Exp(exp) ; cout<<exp; cout<<v1<<endl; cin.get(pause); system("pause" ;break; case 3: CreatePostExp(exp,postexp); cin.get(pause); system("pause" ;break; case 4: v1=Val_PostExp(postexp); cout<<postexp<<"="<<v1<<endl; cin.get(pause); system("pause" ;break; case 5: CreatePreFax(exp, prefax); cin.get(pause); system("pause" ;break; case 6: v2 = Val_PreFax(prefax); cout << prefax << "=" << v2 << endl; cin.get(pause); system("pause" ;break; case 7: cout<<endl; cout<<"已創(chuàng)建的表達(dá)式為:"; cout<<exp<<endl; CreatePostExp(exp,postexp); CreatePreFax(exp,prefax); cin.get(pause); system("pause" break; case 8: cout<<"退出運(yùn)算"<<endl; break; default: cout<<"Invalid choice\n"; break; } }while(choice!=8); } 發(fā)自小木蟲Android客戶端 |
金蟲 (小有名氣)

| 2 | 1/1 | 返回列表 |
| 最具人氣熱帖推薦 [查看全部] | 作者 | 回/看 | 最后發(fā)表 | |
|---|---|---|---|---|
|
[考研] 285求調(diào)劑 +6 | ytter 2026-03-22 | 6/300 |
|
|---|---|---|---|---|
|
[考博] 招收博士1-2人 +3 | QGZDSYS 2026-03-18 | 4/200 |
|
|
[考研] 313求調(diào)劑 +4 | 肆叁貳壹22 2026-03-19 | 4/200 |
|
|
[考研] 317求調(diào)劑 +9 | 申子申申 2026-03-19 | 15/750 |
|
|
[考研] 277材料科學(xué)與工程080500求調(diào)劑 +6 | 自由煎餅果子 2026-03-16 | 6/300 |
|
|
[考研] 266求調(diào)劑 +3 | 哇呼哼呼哼 2026-03-20 | 3/150 |
|
|
[考研] 299求調(diào)劑 +4 | 某某某某位 2026-03-21 | 4/200 |
|
|
[考研] 求調(diào)劑 +3 | 白QF 2026-03-21 | 3/150 |
|
|
[考研] 材料學(xué)學(xué)碩080502 337求調(diào)劑-一志愿華中科技大學(xué) +4 | 順順順mr 2026-03-18 | 5/250 |
|
|
[考研] 一志愿中國石油大學(xué)(華東) 本科齊魯工業(yè)大學(xué) +3 | 石能偉 2026-03-17 | 3/150 |
|
|
[考研] 307求調(diào)劑 +10 | 冷笙123 2026-03-17 | 10/500 |
|
|
[考研]
|
.6lL 2026-03-18 | 8/400 |
|
|
[考研] 324求調(diào)劑 +5 | lucky呀呀呀鴨 2026-03-20 | 5/250 |
|
|
[考研] 廣西大學(xué)家禽遺傳育種課題組2026年碩士招生(接收計(jì)算機(jī)專業(yè)調(diào)劑) +3 | 123阿標(biāo) 2026-03-17 | 3/150 |
|
|
[考研] 081700化工學(xué)碩調(diào)劑 +3 | 【1】 2026-03-16 | 3/150 |
|
|
[考博] 申博26年 +3 | 八6八68 2026-03-19 | 3/150 |
|
|
[考研] 一志愿福大288有機(jī)化學(xué),求調(diào)劑 +3 | 小木蟲200408204 2026-03-18 | 3/150 |
|
|
[考研] 312求調(diào)劑 +8 | 陌宸希 2026-03-16 | 9/450 |
|
|
[考博] 26博士申請(qǐng) +3 | 1042136743 2026-03-17 | 3/150 |
|
|
[考研] 085601求調(diào)劑 +4 | Du.11 2026-03-16 | 4/200 |
|