問題分析: 輸入乙個代數表示式, 表示式只能含有「+」, 「‐」, 「*」, 」/」,(,),1,2,3,4,5,6,7,8,9,0
字元且每個數字均小於 10, 設表示式除括號匹配有誤外無其它錯誤。 編寫演算法對輸入的表
達式進行檢測, 判斷括號匹配是否正確。 如果對於輸入的表示能按照正確的優先順序將最終結
果求出那麼表示式肯定是正確的。 而如果要求出最終結果, 效率會低, 那麼對運算過程進行
簡化, 按照所給的表示式推導出最終可以求出結果那麼表示式肯定是正確的, 括弧肯定匹配。
數學模型: 模擬手算過程, 用棧作為儲存結構約定優先順序。 stack s,op; s 儲存運算子, op
儲存參與運算的數字。 遇到『(』、 數字, 時直接壓入相應的棧中, 當遇到+、 ‐、 *、 /操作符
是先把棧 s 中的棧頂元素取出比較相應的優先順序, 若當前操作符的優先順序低與棧頂的則進行
一次運算。 由於問題要求的是單位數而進行相應的運算後可能會變成小數, 或多位數, 若對
其進行處理會麻煩, 則預設運算後結果是 1, 將以壓入相應的棧中。 若在運算過程中不能進
行或不可操作則說明表示式不正確。
所發策略的選擇 採用蠻力法, 從右向左處理表示式一旦出現錯誤的情況直接輸出不匹配
程式實現:
void cpepeidlg::oncancel()
break;
case '*':
case '/':
e=s.gettop();
if(e=='('||e=='a'||e=='+'||e=='‐')
s.push(m_strin[i]); //棧頂運算子優先順序比『*』, 『/』 低則進棧
else //棧頂運算子優先順序比『*』, 『/』 高
break;
case ')': //當前運算元是『)』
e=s.gettop();
if(e=='a'||e=='(') //棧頂為空或『(』 則表達是有誤
while(e!='(') //取棧頂的運算元進行運算知道取出『)』
s.pop(); //將『(』 出棧
}if(flag) return;
} //檢驗棧中的運算子和運算元是否符合標準
while(s.stackempty()==1) //棧不空進行計算
jisuan();
op.pop(); //若表示式正確最後運算元棧中還有乙個元素, 將其出棧
if(s.stackempty()==0&&op.stackempty()==0)
else
}void cpepeidlg::jisuan()
//c 存放運算子
c=s.gettop(); s.pop();
if(op.stackempty()==0)
a=op.gettop(); op.pop(); //a 存放運算元
if(op.stackempty()==0)
b=op.gettop(); op.pop(); //b 存放運算元
op.push(1); //將計算結果預設為 1 將 1 壓入運算元棧
}
括弧匹配檢驗 括號匹配問題
題目描述 假設表示式中允許包含兩種括號 圓括號和方括號,其巢狀的順序隨意,如 或 等為正確的匹配,或 或 均為錯誤的匹配。現在的問題是,要求檢驗乙個給定表示式中的括弧是否正確匹配?輸入乙個只包含圓括號和方括號的字串,判斷字串中的括號是否匹配,匹配就輸出 ok 不匹配就輸出 wrong 輸入乙個字串 ...
8586 括號匹配檢驗
今天把資料結構學習的 拿出來和分享一下,應該測試能過!8586 括號匹配檢驗 time limit 1000ms memory limit 1000k total submit 679 accepted 182 type program language not limited descriptio...
括號匹配的檢驗
一 題目 假設表示式中可以允許包含三種括號 圓括號 和 方括號 和 和花括號 且這三種括號可按任意的次序巢狀使用。即 或者 等為正確格式,或者均為不正確的格式。編寫判別給定表示式中所含括號是否正確配對出現的演算法。二 思路 檢驗括號是否匹配的方法可以用 期待的急迫程度 這個概念來描述。例如,考慮下列...