棧的三個經典問題 《演算法筆記》同步與補充

2021-10-01 09:28:51 字數 3249 閱讀 1973

逆波蘭式問題(字尾表示式),括號匹配問題,序列輸出問題

題目給出中綴表示式,要求計算出相應的結果

題目鏈結

1、中綴表示式轉換為字尾表示式

原因:中綴表示式適合人類思維,但計算機很難處理,通常要轉化為字尾表示式,利用棧處理

2、計算字尾表示式

中綴轉字尾的具體思路:

1、設定操作符棧(通過比較操作符的優先順序,確定是否出棧),設定佇列來存放字尾表示式

2、掃瞄遍歷中綴表示式,遇到運算元放入佇列,遇到操作符則採取下列方式處理:

2.1、如果碰到的操作符優先順序高於棧頂操作符優先順序,則將碰到的操作符壓入棧中

2.2、如果碰到的操作符優先順序低於或等於棧頂操作符優先順序,則不斷出棧,並存入佇列,直到碰到的操作符優先順序高於棧頂操作符的優先順序

2.3、如果碰到括號,遇到左括號直接壓入棧中,遇到右括號,不入棧,並且不斷彈出棧中操作符,直到碰到左括號,此時拋棄左括號

3、重複上述操作,直到中綴表示式遍歷結束,若操作符棧不空,則全部彈出存入佇列

1、對於中綴字串的處理,涉及字串的分割與拼接

2、字尾表示式需要棧來配合處理,其中彈出的第乙個數字是num2,第二個數字是num1

#include

using

namespace std;

struct node

;string str;

stack s;

queue q;

map<

char

,int

> op;

//中綴轉字尾

void

change()

q.push

(temp);}

else

//是操作符

if(str[i]

==')'

) s.

pop();

i++;continue;}

while

(!s.

empty()

&& op[s.

top(

).op]

>= op[str[i]])

s.push

(temp)

; i++;}

}while

(!s.

empty()

)//輸出字尾表示式

/*while(!q.empty())

else

q.pop();

} printf("\n");*/

}double

compute

(double n1,

double n2,

char c)

}double

calculate()

else

}return s.

top(

).num;

}int

main

(int argc,

char

*ar**)

}while

(!s.

empty()

)//清空棧,初始化棧

change()

;double ans =

calculate()

;printf

("%.2f\n"

, ans);}

return0;

}

題目鏈結

錯誤:[(]) 正確:({})

遇到左括號全部入棧,遇到右括號,判斷棧頂元素是相應左括號則彈出,否則return false(對三種括號單獨判斷),最後棧為空,則互相匹配 return true,棧非空則return false

參考字尾表示式處理括號的方式

遇到左括號直接入棧

遇到右括號,不斷彈出棧頂元素(對三種括號單獨判斷處理)

#include

using

namespace std;

int n;

string str;

intmain

(int argc,

char

*ar**)

for(

int i =

0; i < len; i++)if

(str[i]

=='('

|| str[i]

=='['

|| str[i]=='

else

if(str[i]

==')')if

(s.empty()

)//棧空

else

//找到左括號

}else

if(str[i]

==']')if

(s.empty()

)//棧空

else

//找到左括號

}else

if(str[i]

=='}')if

(s.empty()

)//棧空

else

//找到左括號 }}

if(!cmplt)

else}}

return0;

}

題目鏈結

初始化:將1入棧

遍歷給出的序列,只要棧頂元素與當前序列位置的元素不等時,便繼續入棧,序列下標不動;若棧頂與此時序列元素相等,則出棧,下標加1

當超過棧容量或數字超過給定範圍,則此順序錯誤;若序列遍歷順利結束,說明順序合理

#include

using

namespace std;

int m, n, k;

intmain

(int argc,

char

*ar**)

;int num =

1, index =0;

bool cmplt =

true

;for

(int i =

0; i < n; i++

) s.

push

(num++);

//1入棧

for(

int j =

0; j < n; j++)if

(s.top()

== arr[j]

)//輸出序列和棧頂元素相同

else

else}if

(s.size()

> m)}if

(cmplt)

else

}return0;

}

程序同步的三個經典問題

要求 producer和consumer,二者不能對buffer進行操作 當buffer滿的時候,就不允許producer繼續寫 當buffer空的時候,就不允許consumer繼續讀 訊號量及其初始化 semaphore mutex 1 buffer的鎖 semapore full 0 滿位的數量...

演算法的三個基本問題

1.什麼是演算法?通俗的講演算法就是一種解決問題的策略。演算法的嚴格定義,簡而言之,演算法必須是 1 清楚 明確的定地定義 2 有效,即每乙個步驟都切實可行 3 有限,即可在有限步驟後得到結果。大多數情況下,解決乙個問題可以使用幾個不同的演算法,在編寫最終程式之前需要考慮許多潛在的解決方案。2.演算...

程序同步三個常見問題

生產者 消費者 三個訊號量 empty 緩衝區 空閒 資源數,full 緩衝區 已滿 資源數 保證不會空時消費,滿時生產 保證順序 同步 mutex 代表互斥鎖 保證同一時間只有乙個執行緒可以訪問共享資源 互斥訪問 producer consumer 不能將執行緒裡兩個wait的交換順序,否則會出現...