hdu1237簡單計算器(棧的簡單運用)

2021-07-10 16:35:17 字數 1625 閱讀 5004

題目非常簡單,也是棧的經典應用。這道題是沒有括號的,還有一種四則運算是有括號的。

我們把平時所用的標準四則運算表示式,即「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 對於人腦,轉化過程是對表示式...