1. 程式人生 > >逆波蘭表示式的計算問題

逆波蘭表示式的計算問題

逆波蘭表示式分兩步,首先要把中綴表示式轉換成字尾表示式,然後根據字尾表示式求值。

#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年提出了另一種表示表示式的方法,按此方法,每一運算子都置於其運算物件之後,故稱

波蘭表示式求值

根據逆波蘭表示法,求表示式的值。 有效的運算子包括 +, -, *, / 。每個運算物件可以是整數,也可以是另一個逆波蘭表示式。 說明: 整數除法只保留整數部分。 給定逆波蘭表示式總是有效的。換句話