逆波蘭式問題(字尾表示式),括號匹配問題,序列輸出問題
題目給出中綴表示式,要求計算出相應的結果
題目鏈結
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的交換順序,否則會出現...