逆波蘭表示式的計算問題
逆波蘭表示式分兩步,首先要把中綴表示式轉換成字尾表示式,然後根據字尾表示式求值。
#include <stdio.h>
#include <stack>
#include <stdlib.h>
#include <string>
using namespace std;
//這個是相應的函式宣告
char* MidExpressionToLastExpression(char * szExpression);
int GetAnswerByLastExpression(char* szExpression);
int gLength=0;//統計輸入的數字字元個數(包括我們人為新增的\0)
int main()
{
printf("請輸入一箇中綴表示式");
char* szExpression=new char;
scanf("%s",szExpression);
char* pszTmp=MidExpressionToLastExpression(szExpression);
int result=GetAnswerByLastExpression(pszTmp);
printf("計算結果為%d",result);
system("pause");
}
//中綴表示式轉換為字尾表示式
char* MidExpressionToLastExpression(char * szExpression)
{
stack<char>szStack;//這個棧用作中間棧的作用,用於存放臨時的運算子及數字
stack<char>szResult;//這個棧是最終結果棧
char* tmp=szExpression;
int nlength=strlen(szExpression);
gLength=nlength;
//處理一個單位數的運算
for (int i=0;i<nlength;i++)
{
char chtop='<';
if(szStack.size())
{
chtop=szStack.top();
}else {
if(*(szExpression+i)-'0'<=9&&*(szExpression+i)-'0'>=0)
{
}else{
szStack.push(*(szExpression+i));
chtop=szStack.top();
i++;
}
}
if(*(szExpression+i)-'0'<=9&&*(szExpression+i)-'0'>=0)
{
int j=i+1;
szResult.push(*(szExpression+i));
while(*(szExpression+j)-'0'<=9&&*(szExpression+j)-'0'>=0)
{
szResult.push(*(szExpression+j));
i=j;
j++;
}
szResult.push('\0');//這裡加\0是便於後面的計算,這樣計算就不僅僅是個位數字的計算
gLength++;
}else{
if(chtop=='+'||chtop=='-'||chtop=='(')
{
if(*(szExpression+i)=='*'||*(szExpression+i)=='/'||*(szExpression+i)=='(')
{
//當前優先順序小於要入棧的元素,則入棧
szStack.push(*(szExpression+i));
}else if(*(szExpression+i)=='+'||*(szExpression+i)=='-')
{
szStack.push(*(szExpression+i));
}else if(*(szExpression+i)==')')
{
char tmptop=szStack.top();
while(tmptop!='(')
{
szResult.push(tmptop);
szResult.push('\0'); //這裡加\0是便於後面的計算,這樣計算就不僅僅是個位數字的計算
gLength++;
szStack.pop();
tmptop=szStack.top();
}
szStack.pop();
}
}else{
if(*(szExpression+i)=='(')
{
szStack.push(*(szExpression+i));
}else{
char tmptop=szStack.top();
szResult.push(tmptop);
szResult.push('\0');//這裡加\0是便於後面的計算,這樣計算就不僅僅是個位數字的計算
gLength++;
szStack.pop();
while(szStack.size())
{
szResult.push(szStack.top());
szResult.push('\0');//這裡加\0是便於後面的計算,這樣計算就不僅僅是個位數字的計算
gLength++;
szStack.pop();
}
szStack.push(*(szExpression+i));
}
}
}
}
//最後將臨時棧的運算子輸出
while(szStack.size())
{
szResult.push(szStack.top());
szResult.push('\0');
szStack.pop();
}
int nlen=szResult.size();
char *presult=new char[nlen];
while(szResult.size())
{
*(presult+nlen-1)=szResult.top();
szResult.pop();
nlen--;
}
return presult;
}
//根據字尾表示式求值
int GetAnswerByLastExpression(char* szExpression)
{
string strNum=szExpression;
int tmplength=0;
stack<int>stNum;
int resultNum=0;
while(tmplength<gLength)
{
if(strNum=="*"||strNum=="-"||strNum=="/"||strNum=="+")
{
tmplength+=strNum.length()+1;
int num2=stNum.top();
stNum.pop();
int num1=stNum.top();
stNum.pop();
if(strNum=="*")
{
resultNum=num2*num1;
}else if(strNum=="/")
{
resultNum=num1/num2;
}else if(strNum=="+")
{
resultNum=num1+num2;
}else if(strNum=="-"){
resultNum=num1-num2;
}
stNum.push(resultNum);
szExpression+=strNum.length()+1;
}else{
tmplength+=strNum.length()+1;
stNum.push(atoi(strNum.c_str()));
szExpression+=strNum.length()+1;
}
strNum=szExpression;
}
return resultNum;
}`
相關推薦
逆波蘭表示式計算表示式
#!/usr/bin/python3 # 檔名: StackClass.py # 作者:巧若拙 # 時間:2018-12-12 from StackClass import ListStack,LinkStack def check_parens(text):
java解析字串表示式--逆波蘭表示式的計算
上回合我們講了如何將中綴表示式轉換成逆波蘭表示式,這回合我們講一講如何計算逆波蘭表示式。結合這一回合和上一回合,我們將能夠實現這樣一個功能:計算一箇中綴表示式的結果!話不多說,走起來! 問題來由: 讀入一個字串形式的四則運算表示式,輸出對應的計算結果。如讀入的是“6 *
[LeetCode] Evaluate Reverse Polish Notation 計算逆波蘭表示式
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an integer or another exp
用逆波蘭表示式實現表示式計算
表示式求值計算,如計算1+((2+3)*4)-5的值。 我的思路是先把表示式轉換為逆波蘭表示式,因為逆波蘭表示式更加符合計算機的處理邏輯,把表示式轉換為逆波蘭表示式的演算法如下: 初始化兩個棧:運算子棧s2和儲存中間結果的棧s1; 從左至右掃描中綴表示式; 遇到運算元時,將
逆波蘭表示式的生成及計算
逆波蘭表示式(字尾表示式)生成演算法:(1)構造一個運算子棧,此運算子在棧內遵循越往棧頂優先順序越高的原則。(2)讀入一個用中綴表示法表示的簡單算術表示式,為方便起見,認為地在字串後面加入一個特殊字元“;”,並設其優先順序為0。(3)從左至右掃描該算術表示式的每一個字元,如果
逆波蘭表示式的計算問題
逆波蘭表示式分兩步,首先要把中綴表示式轉換成字尾表示式,然後根據字尾表示式求值。 #include <stdio.h> #include <stack> #include <stdlib.h> #include <
LeetCode: Evaluate Reverse Polish Notation(計算逆波蘭表示式)兩種方法
題目描述Evaluate the value of an arithmetic expression in Reverse Polish Notation.Valid operators are +, -, *, /. Each operand may be an integ
逆波蘭表示式(字尾表示式)的計算
已知12*(3+4)- 6+8/2的字尾表示式為:12 3 4 + * 6 - 8 2 / + 字尾表示式計算時,所有運算按照運算子出現的順序,嚴格從左到右,每個操作符取前兩個運算元進行運算,運算後的結果仍然作為下次的運算元。 那如果已知字尾表
C語言_解決括號匹配問題和逆波蘭表示式求值為題
##1、括號匹配問題: 解決思路: void MatchBrackets (const char* str) { char* per = NULL; int i = 0; Stack s; assert (str != NULL); InitStack (&s);
leet150. 逆波蘭表示式求值
題目: 求在 逆波蘭表示法 中算術表示式的值。 有效的運算子號包括 +, -, *, / 。每個運算物件可以是整數,也可以是另一個逆波蘭計數表達。 例如: ["2", "1", "+", "3", "*
LeetCode:逆波蘭表示式求值【150】
LeetCode:逆波蘭表示式求值【150】 題目描述 根據逆波蘭表示法,求表示式的值。 有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另一個逆波蘭表示式。 說明: 整數除法只保留整數部分。 給定逆波蘭表示式總是
佇列&棧//逆波蘭表示式求值
根據逆波蘭表示法,求表示式的值。 有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另一個逆波蘭表示式。 說明: 整數除法只保留整數部分。 給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且
LeetCode150.逆波蘭表示式求解(Evaluate Reverse Polish Notation)
題目描述 根據逆波蘭表示法,求表示式的值。 有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另一個逆波蘭表示式。 說明: 整數除法只保留整數部分。 給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 0 的情況。
中綴表示式轉化為字尾表示式(逆波蘭表示式)
1.將中綴表示式轉化為字尾表示式 字尾表示式也叫作逆波蘭表示式,主要是運用棧的後進先出思想,下面就講講我自己的思考, 假設中綴表示式為:2*(2+1)-6(4-2)#,則字尾表示式為:2 2 1 + * 6 4 2 - / -; 首先依次遍歷中綴表示式,遇到運算元字元則直接輸出(數字字元
遞迴:逆波蘭表示式
1.問題 逆波蘭表示式的定義: 一個數是一個逆波蘭表示式,值為該數; “運算子 逆波蘭表示式 逆波蘭表示式” 是逆波蘭表示式,值為兩個逆波蘭表示式的值運算結果 樣例輸入: * + 11.0 12.0 + 24.0 35.0 樣例輸出: 1357.000000 提示:
[Swift]LeetCode150. 逆波蘭表示式求值 | Evaluate Reverse Polish Notation
Evaluate the value of an arithmetic expression in Reverse Polish Notation. Valid operators are +, -, *, /. Each operand may be an
LeetCode150 逆波蘭表示式求值
根據逆波蘭表示法,求表示式的值。 有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另一個逆波蘭表示式。 說明: 整數除法只保留整數部分。 給定逆波蘭表示式總是有效的。換句話說,表示式總會得出有效數值且不存在除數為 0
Openjudge-2694-逆波蘭表示式
這是波蘭表示式,題目中叫它是逆波蘭式。 這個題的話,我們用遞迴求解,首先理解一下波蘭表示式,就是將運算子前移了。 像是二叉樹的遍歷一樣,前序遍歷就是波蘭式,中序遍歷就是中綴表示式,後序遍歷就是逆波蘭表示式。 我們讀入一項之後就進行處理,這裡的讀入因為題目中給出了空格,也就是一次讀入的結束
棧應用逆波蘭表示式
逆波蘭表示式 逆波蘭表示式又叫做字尾表示式。在通常的表示式中,二元運算子總是置於與之相關的兩個運算物件之間,這種表示法也稱為中綴表示。波蘭邏輯學家J.Lukasiewicz於1929年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱
逆波蘭表示式求值
根據逆波蘭表示法,求表示式的值。 有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另一個逆波蘭表示式。 說明: 整數除法只保留整數部分。 給定逆波蘭表示式總是有效的。換句話