題目非常簡單,也是棧的經典應用。這道題是沒有括號的,還有一種四則運算是有括號的。
我們把平時所用的標準四則運算表示式,即「9+(3-1)*3+10/2」叫做中綴表示式。因為所有的運算符號都在兩數字的中間,現在我們的問題就是中綴到字尾的轉化。
中綴表示式「9+(3-1)3+10/2」轉化為字尾表示式「9 3 1-3+ 10 2/+」
字尾表示式方便計算機計算,所以我們要把中綴表示式轉換成字尾表示式。我可以用兩個棧,乙個是儲存數字的數字棧,乙個是儲存符號的符號棧。
這篇文章很好的表示轉換的過程:
除此之外,這個問題還有個關鍵是對兩個符號的比較:
我把符號的比較分為兩個情況,一種是棧頂符號是+或-,進去的為*或/,這種情況可以入棧。其他情況都可以把棧頂符號出棧。
只要理解符號的判斷,其他的也不是難點。
if ((b == '*' || b =='/') && (a == '+' || a == '-'))
return
false;
**:
#include
#include
#include
using
namespace
std;
char s[205];
stack
stnum;
stack
stop;
// (1 + 2 ) * 3
//判斷有括號的情況
bool check1(char b)
return
false;
}//判斷沒有括號的情況
bool check1(char b)
return
false;
}//用於沒有括號
void solve()
else
stnum.push(temp);
}stop.push(s[i]);}}
else
if (s[i] >= '0'&&s[i] <= '9')
stnum.push(sum);}}
while (stop.size()>0)
stnum.push(temp);
}printf("%.2lf\n", stnum.top());
stnum.pop();
}//用於有括號
void solve2()
else
stnum.push(temp);
}stop.push(s[i]);}}
else
if (s[i] >= '0'&&s[i] <= '9')
stnum.push(sum);
}else
if(s[i]=='(')
else
if (s[i]==')')
stnum.push(temp);
}stop.pop();}}
while (stop.size()>0)
stnum.push(temp);
}printf("%.2lf\n", stnum.top());
stnum.pop();
}int main()
return
0;}
hdu 1237 簡單計算器 棧
這個題目是大部分人都是用棧來寫的,本週訓練老師也講了兩次棧的原理。自己最近也看了資料結構中與棧有關的內容,還是比較深刻理解了沒有括號情況下表示式求解。include include include using namespace std char s 250 post 250 s是輸入的中綴表示式,...
hdu 1237 簡單計算器(棧)
hdu 1237 簡單計算器 棧 如果是 就把原數壓入棧 如果是 就把相反數壓入棧 如果是 就把當前數和棧頂數計算後壓入棧 如果是 就把當前數和棧頂數計算後壓入棧 注意該題是3 2而不是3 2,有空格 include include include include includeusing name...
hdu1237 簡單計算器 棧
題目鏈結 題目給出的是中綴表示式,中綴表示式是我們習慣上用的計算表示式,人腦計算方便快速,但是計算機不然,計算機計算波蘭和逆波蘭表示式都很方便,但對中綴表示式通常需要轉化成字首或字尾表示式才方便計算。舉例 4 2 5 7 11 轉化成逆波蘭的形式是 4 2 5 7 11 對於人腦,轉化過程是對表示式...