我們利用棧將中綴表示式轉換為字尾表示式(逆波蘭表示式)來計算表示式
此程式支援整數運算(+、-、*、/、^、())
遍歷中綴表示式,遇到運算元就輸出,遇到符號就壓入棧中(棧中的運算子為掛起狀態),但是操作符的壓棧出棧有如下規則:
碰到運算元壓入棧中,碰到運算子提取棧頂兩個元素進行相應的操作,將運算元壓入棧中,直到整個表示式遍歷完成,棧中的元素就是最後的計算結果
程式清單:
#include #include #include #include #include using namespace std;
double cal(string str)//計算字尾表示式
} else//當前的是運算元,直接壓入棧中
}return s.top();//將棧中的唯一乙個元素輸出就表示是最後的運算結果
}string trans(string str)
else
}//開始計算字尾表示式
stringstream input(str1);
string temp, out;
stacks;
while (input >> temp)
//知道碰見左括號
s.pop();//左括號彈出並不輸出
}else
return " ";
} else if (temp[0] == '+' || temp[0] == '-')
else
}s.push(temp[0]);//該輸出的運算子輸出之後將當前的運算子(+或者-)壓入棧中}}
else if (temp[0] == '*' || temp[0] == '/')//如果是*或者/
s.push(temp[0]);//輸出以後將當前操作符壓棧
} else if (temp[0] == '^' || temp[0] == '(')//這兩個運算子的優先順序最高,直接入棧即可
else
}while (!s.empty())//遍歷完成之後將棧中剩餘的運算子輸出
return out;
}int main()
return 0;
}
中綴表示式轉字尾(逆波蘭)表示式
原則 從左到右遍歷中綴表示式 1 如果是數字則直接輸出 2 如果是左括號,直接入棧 3 如果是右括號,直接棧頂元素出棧並輸出,直到遇到左括號,左括號只出棧,不輸出 4 如果是符號,如果優先順序不高於棧頂符號則棧頂元素依次出棧並輸出 如果遇到 符號,如果棧非空並且棧頂元素不是左括號,則出棧並且輸出,否...
字首(波蘭) 中綴 字尾(逆波蘭)表示式
字首 中綴 字尾表示式是對表示式的不同記法,其區別在於運算子相對於運算元的位置不同,字首表示式的運算子位於運算元之前,中綴和字尾同理。字首表示式又稱波蘭式,字首表示式的運算子位於運算元之前。舉例說明 3 4 5 6對應的字首表示式就是 3456。字首表示式的計算機求值 從右往左掃瞄表示式,遇到數字時...
逆波蘭計算器 中綴表示式轉字尾表示式
1 2 3 4 5 2 這就叫中綴表示式,也就是說運算子在兩個運算元中間,這比較符合我們人類正常的計算題書寫規則與習慣.一目了然有木有 1,2,3依次進棧,此時棧內依次為1 2 3 遇到 2 3出棧計算得到5,5再進棧,此時棧內依次為1 5 4進棧,此時棧內依次為1 5 4 遇到 4 5 出棧計算得...