中綴表示式(infix expression)即 平時生活中大家對於算式的書寫格式
( eg: 6*((5+(2+3)*8)+3) );
字尾表示式(post expression)即 把數字和運算子分開,把運算子的優先順序運算內涵到字尾式的數字和運算子的順序
中(故其
優點就是,沒有必要知道任何優先的規則
),乙個運算子只對其前邊的兩個數字起作用
( eg: 652 3+8*+3+*);
中綴轉字尾:
·讀入表示式,若是數字放入輸出字串;·若是運算子,則先與棧頂元素比較:
-棧空,直接壓入棧;-否則比較優先順序:
(優先順序順序:當前(
>
*、/>
+、->
棧中 (
>
) )
~當前=棧頂:出棧後壓入當前;~當前《棧頂:出棧 至 當前=棧頂 進行處理 / 出棧,當前不進棧直接放入輸出字串;
~當前》棧頂:壓入棧;
~若是 ) :出棧 至 ( 為止,但是(和)不放入輸出字串。
時間複雜度: o(n)**如下:
(智障的我只想到了各種if,然後括號只有 () ,運算子只有 +-*/ )
string infixtopostfix(const string s)
else
switch (s[i])
if (mark.top() == '+' || mark.top() == '-')
else
mark.push(s[i]);
}else if (mark.top() == '+' || mark.top() == '-')
else mark.push(s[i]);
break;
case '*':
case '/':
if (mark.top() == '*' || mark.top() == '/')
mark.push(s[i]);
break;
case '(':
mark.push(s[i]);
break;
case ')':
while (mark.top() != '(' && !mark.empty())
mark.pop();
break;
default:
break;
}} }
while (!mark.empty())
return post_s;
}
字尾計算:
·見到數字時,壓入棧;·見到運算子時,從棧中彈出兩個數 second 運算子 first,後再壓入棧;
時間複雜度: o(n)
**如下:
(開始總不對,才意識到,char的數字轉換成int,是需要 - 『0』,得到的時和0,相差的ascii碼數值)
int postfixcompute(const string s)
} }return result.top();
}
這兩個是套裝,故奉上main()函式,可以一試~:
//6*((5+(2+3)*8)+3)
int main()
中綴轉字尾(棧)
字尾表示式也叫逆波蘭表示式,其求值過程可以用到棧來輔助儲存。假定待求值的字尾表示式為 6 5 2 3 8 3 則其求值過程如下 1 遍歷表示式,遇到的數字首先放入棧中,此時棧如下所示 2 接著讀到 則彈出3和2,執行3 2,計算結果等於5,並將5壓入到棧中。3 讀到8,將其直接放入棧中。4 讀到 彈...
棧的應用(括號匹配 字尾表式計算 中綴轉字尾)
ifndef stack h struct node typedef struct node ptrtonode typedef ptrtonode stack typedef float elementtype int isempty stack s stack createstack void ...
6 棧 中綴轉字尾
概念 棧的基本操作包括建立棧 銷毀棧 出棧 入棧 獲取棧頂元素 獲取棧的大小 清空棧。stack.h pragma once typedef int elemtype define stacksize 10 typedef struct stack sqstack,psqstack bool ini...