棧應用 中綴轉字尾 字尾計算

2021-08-06 05:45:58 字數 2107 閱讀 9639

中綴表示式(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...