括號匹配問題 棧實現佇列

2021-10-04 19:03:04 字數 1583 閱讀 7941

在對棧的學習時,見到了兩個棧的應用場景,乙個是括號匹配問題,乙個是用棧來實現佇列。

括號匹配問題的解決:

首先基於棧的基礎上,實現括號匹配問題,要使用到棧的基本操作,入棧,獲取棧頂元素,出棧等。

首先,先將左括號入棧,然後進行括號匹配,如果匹配成功,則讓已經匹配成功的左括號出棧,繼續進行匹配,直到外部的括號匹配完畢。

匹配完畢後,如果棧不為空,說明有左括號未被匹配成功,則表明匹配失敗,如果為空則表明所有括號都匹配成功。

以下是基於棧實現的括號匹配問題:

bool isvalid

(char

* s)

int size =

strlen

(s);

//字串長度

stack st;

stackinit

(&st)

;for

(int i=

0; i)else

char ch =

stacktop

(&st)

;//獲取棧頂元素(也就是獲取左括號)if(

(ch==

'('&& s[i]

==')')||

(ch=='')

||(ch==

'['&& s[i]

==']'))

else}}

//匹配結束,但棧中還有元素,則表明左括號有剩餘if(

!stackempty

(&st)

)return true;

}

用棧實現佇列。

棧是一種先進後出的結構,佇列是先進先出,這裡我採用兩個棧st1和st2來實現佇列。

首先確定st1為入棧也就是入隊的操作棧。

其次進行出棧時,先判定st2是不是為空,如果是,就將st1中的元素插入到st2中去,這時將st2棧中元素進行出棧操作即可得到出隊。

以下是基於棧的基本操作實現的佇列:

typedef

struct

myqueue;

myqueue*

myqueuecreate()

//入佇列

void

myqueuepush

(myqueue* obj,

int x)

//出佇列

intmyqueuepop

(myqueue* obj)

}int ret =

stacktop

(&obj->st2)

;stackpop

(&obj->st2)

;return ret;

}//獲取隊頭元素

intmyqueuepeek

(myqueue* obj)

}return

stacktop

(&obj->st2);}

//判斷佇列是否為空

bool myqueueempty

(myqueue* obj)

return false;

}void

myqueuefree

(myqueue* obj)

棧和佇列 用棧實現括號匹配

一 棧匹配 思路 借助棧來實現括號的匹配,如果碰到的是三種左括號的話,將左括號進行入棧,以為需要匹配到括號肯定都是右括號於左括號進行匹配的,所以遇到左括號直接入棧就可以了。如果遇到右括號,需要進行匹配,如果目前棧中為空的話,直接返回false,因為這個括號很明顯的多出來了。如果不為空,將棧中的乙個元...

括號匹配(棧與佇列)

描述 給定乙個字串,字串只包含兩種字元 左括號 和右括號 請判斷這些括號是否能匹配。如果能則輸出yes,不能則輸出no。輸入 一行,括號序列 乙個字串 輸出 yes no 樣例輸入 樣例輸出 yesac 基於很水的樣例的計數 include include include using namespa...

棧實現括號匹配

匹配思想 從左至右掃瞄乙個字串 或表示式 則每個右括號將與最近遇到的那個左括號相匹配。則可以在從左至右掃瞄過程中把所遇到的左括號存放到堆疊中。每當遇到乙個右括號時,就將它與棧頂的左括號 如果存在 相匹配,同時從棧頂刪除該左括號。演算法思想 設定乙個棧,當讀到左括號時,左括號進棧。當讀到右括號時,則從...