我們要做的是,對乙個字串的左右括號進行匹配。例如,字串(a*(b+c)+d)這個字串的括號就是匹配的,沒有多餘的左括號或右括號。
這是資料結構中的一類很經典的問題。
對於這個問題,思路上要正確。如果從左至右的掃瞄乙個字串,那麼每乙個右括號都和都與最近掃瞄的那個未匹配的左括號相匹配。這種觀察結果促使我們在在從左至右的掃瞄的過程中,將掃瞄到的左括號都存在棧中,。每當掃瞄到乙個右括號,就將它與棧頂的左括號相匹配(如果存在),並將匹配的左括號從棧中刪除。
雖然現在c++中有現成的stack類可以供我們直接使用,但是我們必須要明白其中背後的工作原理。所以我給出的是沒有使用stack類的**(純原創)
下面展示一些內聯**片
。
int main()
for(int i =
0;i<
10;i++
)else
if(size !=0)
}else
if(a[i]
==')'
)delete searchpoint;
size--
; cout
else
if(size !=0)
}
在這個辦法中,其實更偏向於c的一些用法和思路(因為c++裡有直接可以使用的類嘛,所以我就根據思路自己寫出來的類stack的背後工作原理)。主要展示的是入棧(壓棧),出棧操作。
第二種解決方法其實就是模仿stl中的stack類,自己寫出乙個stack類,並且使用它。因為會用到類,所以這個方法比上乙個方法的**體量更大。但是這個方法只有可擴充套件性的,即我們可以在此基礎上增添操作等。
#include
using namespace std;
template<
class
t>
struct node
node(t
& element)
node
(node<
t>
* next)};
template<
class
t>
class
stacklist
stacklist
(int size,node<
t>
* firstnode)
; bool empty()
;void
insertfunction
(t element,node<
t>
* head,node<
t>
* p)
;void
popfunction
(node<
t>
* head);~
stacklist()
};template<
class
t>
void stacklist<
t>::
popfunction
(node<
t>
* head)
cout<<
"111111111111111"
; cout
null
;delete searchpoint;
}template<
class
t>
void stacklist<
t>::
insertfunction
(t element,node<
t>
* head,node<
t>
* p)
else
if(size !=0)
}template<
class
t>
stacklist<
t>::
stacklist
(int size,node<
t>
* firstnode)
template<
class
t>
bool stacklist<
t>::
empty()
else
return
false;}
int main()
for(int i =
0;i<
10; i++
)else
if(a[i]
==')')}
if(m.
empty()
==true
)else
if(m.
empty()
==false
)}
資料結構之棧及棧的應用(括號匹配問題)
棧簡介 棧是一種特殊的線性表,其只允許在固定的一端進行插入和刪除元素操作。進行資料插入和刪除操作的一段稱為棧頂,另一端稱為棧底。不含任何元素的棧稱為空棧,其特點為 先進後出。棧功能 可以將資料從一種序列變為另一種序列 注 來自網路 1.實現棧的如下介面 實現成動態棧 typedef int data...
資料結構實驗之棧四 括號匹配
time limit 1000ms memory limit 65536k 給你一串字元,不超過50個字元,可能包括括號 數字 字母 標點符號 空格,你的任務是檢查這一串字元中的 是否匹配。輸入資料有多組,處理到檔案結束。如果匹配就輸出 yes 不匹配輸出 no sin 20 10 yesno ma...
資料結構實驗之棧四 括號匹配
資料結構實驗之棧四 括號匹配 time limit 1000ms memory limit 65536k 題目描述 給你一串字元,不超過50個字元,可能包括括號 數字 字母 標點符號 空格,你的任務是檢查這一串字元中的 是否匹配。輸入 輸入資料有多組,處理到檔案結束。輸出 如果匹配就輸出 yes 不...