在對棧的學習時,見到了兩個棧的應用場景,乙個是括號匹配問題,乙個是用棧來實現佇列。
括號匹配問題的解決:
首先基於棧的基礎上,實現括號匹配問題,要使用到棧的基本操作,入棧,獲取棧頂元素,出棧等。
首先,先將左括號入棧,然後進行括號匹配,如果匹配成功,則讓已經匹配成功的左括號出棧,繼續進行匹配,直到外部的括號匹配完畢。
匹配完畢後,如果棧不為空,說明有左括號未被匹配成功,則表明匹配失敗,如果為空則表明所有括號都匹配成功。
以下是基於棧實現的括號匹配問題:
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...
棧實現括號匹配
匹配思想 從左至右掃瞄乙個字串 或表示式 則每個右括號將與最近遇到的那個左括號相匹配。則可以在從左至右掃瞄過程中把所遇到的左括號存放到堆疊中。每當遇到乙個右括號時,就將它與棧頂的左括號 如果存在 相匹配,同時從棧頂刪除該左括號。演算法思想 設定乙個棧,當讀到左括號時,左括號進棧。當讀到右括號時,則從...