hdu 1237 字尾表示式 棧的應用

2021-07-04 03:49:05 字數 1232 閱讀 4680

這幾天在預習資料結構的知識。。剛好看到棧的應用 字尾表示式(逆波蘭表示式)。

字尾表示式:操作符都在數字的後面,首先要運用字尾表示式,要明白如何從中綴表示式轉換到字尾表示式,然後如何從字尾表示式進行計算。

首先中綴轉字尾:

將表示式讀入,數字直接輸出到字尾表示式中,符號則 判斷其與棧頂元素之間優先順序的關係,如果優先順序不高於棧頂元素的優先順序,則將棧頂元素輸出,再對新的棧頂元素進行重複操作。直到最後將該符號壓入棧中。 如果符號是右括號,將與棧中遇到的第乙個左括號之間的符號都輸出, 括號都不用輸出。

通過字尾表示式進行計算:

將數字都壓入另乙個存放數字的棧之中,碰到字元就將棧頂元素取出當做第二運算元,彈出,再取乙個當做第一運算元,彈出,將計算結果再壓入棧中。

第一次寫還是寫了好久,思路也不能說非常清晰。這道題目我用了『#』來分隔每個數字與操作符,因為不分隔的話無法判斷這是多位的數字還是兩個數字。

記錄字尾表示式的陣列記得要初始化,或者邊界不用strlen。

#include #include #include #include #include #include using namespace std;

#define m 1009

char a[m] = "+-*/";

int b[m] = ;

char out[m];

char in[m];

stacks; //存放操作符

int main()

}else

if(a[j]==s.top())

}if(p!=-1 && q!=-1)

else break;}}

s.push(in[i]);}}

while(!s.empty())

//printf("%s\n",out);

//int p = 0;

double sum = 0;

stackss; //存放數字

int ok = 0;

for(int i = 0;i < k;i++) //迴圈到字尾表示式的最後乙個

else

if(out[i]!='#')}}

}if(!ss.empty())

printf("%.2f\n",ss.top());

while(!ss.empty()) ss.pop();

while(!s.empty())s.pop();

}return 0;

}

HDU1237 表示式求值

讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。對每個測試用例輸出1行,即該表示式的值,精確到小數點後2位。1 2 4 2 5 ...

hdu1237 表示式求值)

怎麼講呢,我做這題做了很久都沒有做出來,然後我是看別人部落格才寫出來的。做完這題給我什麼感覺呢,做題一定要細心!細心!細心!重要的事情說三遍!ac include include intmain else if str i str i str i str i fuhao t str i 存符號 me...

HDU 1237 簡單計算器 表示式求值

讀入乙個只包含 的非負整數計算表示式,計算該表示式的值。input 測試輸入包含若干測試用例,每個測試用例佔一行,每行不超過200個字元,整數和運算子之間用乙個空格分隔。沒有非法表示式。當一行中只有0時輸入結束,相應的結果不要輸出。output 對每個測試用例輸出1行,即該表示式的值,精確到小數點後...