資料結構與演算法(4) 棧的應用

2021-10-06 15:46:21 字數 3337 閱讀 8045

#include

#include

#include

using namespace std;

bool matchbrackets

(char

* pstr)

else

if(pstr[i]

=='}'

|| pstr[i]

==')'

|| pstr[i]

==']'

)else

'&&s.

top()==

'else}}

}if(s.empty()

)else

}int

main()

}";char ptr2=

"";matchbrackets

(ptr1)

;matchbrackets

(ptr2)

;system

("pause");

return0;

}

1.前/中/字尾表示式的轉換(首先需要明白三者之間的轉換)

自然表示式轉換為前/中/字尾表示式,其實是很簡單的。首先將自然表示式按照優先順序順序,構造出與表示式相對應的二叉樹,然後對二叉樹進行前/中/字尾遍歷,即得到前/中/字尾表示式。

舉例說明將自然表示式轉換成二叉樹:

a×(b+c)-d

① 根據表示式的優先順序順序,首先計算(b+c),形成二叉樹

②然後是a×(b+c),在寫時注意左右的位置關係

③最後在右邊加上 -d

然後最這個構造好的二叉樹進行遍歷,三種遍歷的順序分別是這樣的:

① 前序遍歷:根-左-右

② 中序遍歷:左-根-右

③ 後序遍歷:左-右-根

所以還是以剛才的這個例子,在最終二叉樹的基礎上可以得出:

字首表示式:-a+bcd

中綴表示式:ab+c-d

字尾表示式:abc+*d-

2.中綴表示式轉字尾表示式(棧的應用)

中綴表示式「9+(3-1)*3+10/2」轉化為字尾表示式為「9 3 1- 3 * + 10 2 / +」.

規則:從左到右遍歷中綴表示式的每一數字和符號,若是數字就輸出,即成為字尾表示式的一部分;若是符號,則判斷其與棧 頂符號的優先順序,是右括號或優先順序低於棧頂符號(乘除優先加減)則棧頂元素依次出棧並輸出,並將當前符號進棧,一直到最終輸出字尾表示式為止。

a.初始化一空棧,用來對符號進出棧使用。

b.第乙個字元是數字9,輸出9,後面是符號「+」,進棧。

c.第三個字元是「(」,依然是符號,因其只是左括號,還沒有配對,故進棧。

d.第四個字元是數字3,輸出,總表示式為9 3,接著是「-」,進棧。

e.接下來是數字1,輸出,總表示式為9 3 1,後面是符號「)」,此時,我們需要去匹配此前的「(」,所以棧頂依次出棧,並輸出,直到「(」出棧為止。此時左括號上方只有「-」,因此輸出「-」。總的表示式為9 3 1 -。

f.接著是數字3,輸出,總的表示式為9 3 1 - 3.緊接著是符號「」,因為此時的棧頂符號為「+」號,優先順序低於「」,因此不輸出,「」進棧。

g.之後是符號「+」,此時當前棧頂元素「」比這個「+」的優先順序高,因此棧中元素出棧並輸出(沒有比「+」更低的優先順序,所以全部出棧),總輸出表示式為9 3 1 - 3 * +。然後將當前這個符號「+」進棧。

h.緊接著數字10,輸出,總表示式為9 3 1 - 3 * + 10。後是符號「/」,所以「/」進棧。

i.最後乙個數字2,輸出,總的表示式為9 3 1 - 3 * + 10 2。

j.因已經到最後,所以將棧中符號全部出棧並輸出。最終輸出的字尾表示式結果為9 3 1 - 3 * + 10 2 / +。

3.字尾表示式計算結果(棧的應用)

字尾表示式為:9 3 1 - 3 * + 10 2 / +

規則為:從左到右遍歷表示式的每個數字和符號,遇到是數字就進棧,遇到是符號,就將處於棧頂兩個數字出棧,進行運算,運算結果進棧,一直到最終獲得結果。

a.初始化乙個空棧。此棧用來對要運算的數字進行進出使用。

b.字尾表示式中前三個是、都是數字,所以9 3 1 進棧。

c.接下來是「-」,所以將棧中的1出棧作為減數,3出棧作為被減數,並運算3-1得到2,再講2進棧。

d.接著是數字3進棧。

e.後面是「*」,也就意味著棧中3和2出棧,2與3相乘,得到6,並將6進棧。

f.下面是「+」,所以棧中6和9出棧,9和6相加,得到15,將15進棧。

g.接著是10和2兩數字進棧。

h.接下來是符號「/」,因此,棧頂的2與10出棧,10與2相除,得到5,將5進棧。

i.最後乙個是符號「+」,所以15與5出棧並相加,得到20,講20進棧。

j.結果是20出棧,棧變為空。

//下面的**只是支援一些簡單的整數的加減乘除運算,而且不支援浮點數,負數或者數字大於9的數字的運算,只是

//自己簡單的寫乙個**,將這個過程進行的簡單驗證,如果需要解決複雜的計算問題,可以上網查詢資料來實現!

#include

#include

#include

#include

using namespace std;

stack<

char

> s;

stack<

int> ss;

intmain()

}else

s.push

(str1[i]);

}}else}}

}}if(s.

size()

!=0)}

cout << str2 << endl;

//由字尾表示式計算結果

int temp1, temp2, te***;

len2 = str2.

length()

;for

(i =

0; i < len2; i++

)else

else

if(str2[i]

=='-'

)else

if(str2[i]

=='*'

)else

if(str2[i]

=='/'

) ss.

push

(te***);}

} cout << ss.

top(

)<< endl;

}system

("pause");

}/*****

9+(3-1)*3+10/2

****/

資料結構與演算法(4)棧

後進者先出,先進者後出,就是典型的 棧 結構。從棧的操作特性上來看,棧是一種 操作受限 的線性表 只允許在一端插入和刪除資料。從功能上來說,陣列或鍊錶可以替代棧,但特定的資料結構是對特定場景的抽象,陣列或鍊錶暴露了太多的操作介面,操作上的確靈活自由,但使用時就比較不可控,自然也就更容易出錯。當某個資...

資料結構與演算法 棧的應用

逆序輸出 輸出的次序和處理次序相反,而且遞迴的深度不容易預知。比如進製轉換,括號匹配 進製轉換 void convert stack char s,int n,int base while n 0 括號匹配 括號匹配 bool paren vector char v elseif s.empty e...

資料結構與演算法 4 棧與佇列

目錄 一.棧的定義 1.棧的定義 2.進棧出棧變化形式 二.棧的抽象資料型別 三.棧的順序儲存結構及實現 1.棧的順序儲存結構 2.棧的順序儲存結構 進棧操作 3.棧的順序儲存結構 出棧操作 四.兩棧共享儲存空間 五.棧的鏈式儲存結構 1.棧的鏈式儲存結構 2.棧的鏈式儲存結構 進棧操作 3.棧的鏈...