基本資料結構 棧的實現及其運用

2021-06-23 02:57:22 字數 3996 閱讀 2529

概述:資料結構是用來實現動態集合的方式。動態集合有兩個要素,一是動態集合中的元素,二是動態集合上的操作如search(s,k):其中s為給定的集合,k為所要查詢的關鍵字。insert(s,k),delete,maximun,minimum,successor,predecessor等。

這裡介紹幾種簡單的資料結構:棧,佇列,鍊錶,有根樹。

棧有一定限制的表,元素的插入和刪除只能在表頭進行,棧雖然缺少魯棒性,但是更有效,並且很容易應用,棧後進先出。基本的操作包括進棧push,出棧pop,判空isempty,取棧頂元素peer,返回棧的大小getsize。下圖push,pop操作示意(基於陣列)。

(),這些括號時候符合規則,實現方法有很多這裡用棧實現,

bool check(char *str)

'&&ch.pop()=='

}3.2 計算表示式的值

中綴表示式轉換成字尾表示式,計算字尾表示式的值

表示式形式介紹見

infix notation : a + b(中綴)

prefix notation : + a b(字首)

postfix notation: a b +(字尾)

為什麼我們需要前字尾這種反自然的方式呢?用前字尾就能夠在不需要括號的情況下處理複雜情況,同時也更適合於計算機處理,只需要對字尾表示式從左往右掃瞄一次就能夠計算值了。所以一般計算中綴表示式的時候,分為兩步進行,第一步轉換成為字尾表示式,然後根據字尾表示式求值。字尾表示式不需要考慮運算子的優先順序,因為在轉換過程中已經考慮了。

怎麼進行轉換?先看乙個人工轉換的例子,然後推導計算機轉換原則。

假設有乙個中綴表示式a+b*c-(d+e)

1.首先將這個中綴表示式的所有運算加括號((a+(b*c))-(d+e))

2.然後將所有運算子放到括號後面,這樣就變成了((a(bc)* )+ (de)+ )-

3.把所有括號去掉abc*+de+-,最後得出的結果就是字尾表示式

這樣轉換的原理何在?我們知道新增括號就是指定優先順序,巢狀在裡面的括號優先順序更高,而順序的括號優先順序一致。乙個括號相當於乙個子表示式,把運算子放到括號後面是用來連線括號裡的兩個運算元(這就是為什麼叫字尾表示式)。如何用計算機來轉換呢?

1.首先表示式是以字串的形式儲存的,需要乙個棧來儲存運算子,掃瞄中綴表示式,遇到運算元輸出到字尾表示式。

2.然後遇到運算子入棧,根據棧中運算子和將要輸入棧的運算子優先順序來決定輸出哪個,如果將要入棧運算子優先順序大於棧頂元素就入棧,反之若入棧的元素的優先順序小於等於棧頂元素則先輸出棧中元素後入棧因為棧是後進先出的,所以優先順序高的要在後,同時要保證棧中運算優先順序是遞增的。對於括號而言,括號內的運算子要滿足前面規則外,當括號結束時,括號裡的運算子也要全部輸出。

#include "

stack_array.h

"#include

const

int sizes=500;

int priorty(char a, char b)

/*

中綴表示式轉字尾表示式

中綴表示式之間無分割

字尾表示式運算元、操作符之間用空格分割,便於區分不同運算元

*/void infix_to_suffix(char* infix, char* suffix)

else

if(infix[i] == ')')

s.pop();

} else

if(s.isempty()|| priorty(s.peer(), infix[i]))

else

s.push(infix[i]) ;//

當前操作符入棧}}

}//補充空格分割

if(suffix[j-1] != '

')

//如果操作符棧不為空,彈出所有操作符

while(!s.isempty())

suffix[j] = '

\0';

cout*

字尾表示式求值

*/int suffix_value(char* suffix)

else

if(suffix[i] == '

')

else }}

return si.peer();

}int main()

程式包括三個子函式,乙個是指定優先順序,二是轉換,三是計算字尾表示式的值。

轉換過程中要注意,每個運算元之間要加空格,以便後續計算值比如2345+到底是23+45還是2+345,沒有空格後面無法區分,加上23 45 +就明了。程式主要是掃瞄中綴表示式,對於遇到的字元分情況處理。

計算字尾表示式值時,關鍵如何把字元的值轉成數字,計算好乙個子表示式值後要將其值入棧。

參考:

上圖演示了如何把中綴轉換成字首的過程,stackvect:表示的是儲存操作符的棧,而右邊分別為中綴和輸出的字尾表示式。

基本資料結構 佇列的實現及其運用

佇列是一種先進先出的資料結構,元素只能新增到隊尾,而對元素的刪除,修改,檢索只能在隊頭進行。與棧的差異是很明顯的。同樣佇列的實現可以基於鍊錶,也可以基於陣列。和棧的基本操作差不多,但佇列多了乙個指標 標號 指向末尾的元素,因為需要在末尾插入元素。ifndef queue h define queue...

基本資料結構 佇列的實現及其運用

佇列是一種先進先出的資料結構,元素只能新增到隊尾,而對元素的刪除,修改,檢索只能在隊頭進行。與棧的差異是很明顯的。同樣佇列的實現可以基於鍊錶,也可以基於陣列。和棧的基本操作差不多,但佇列多了乙個指標 標號 指向末尾的元素,因為需要在末尾插入元素。ifndef queue h define queue...

基本資料結構 棧

基本資料結構 棧 一.線性資料結構 我們從四個簡單但重要的概念開始研究資料結構。棧,佇列,deques 雙向佇列 列表是一類資料的容器,它們資料元素之間的順序由新增或刪除的順序決定。一旦乙個資料元素被新增,它相對於前後元素一直保持該位置不變。諸如此類的資料結構被稱為線性資料結構。線性資料結構有兩端,...