為了實現用棧計算算數表示式的值,需設定兩個工作棧:用於儲存運算子的棧opter,以及用於儲存運算元及中間結果的棧opval。
演算法基本思想如下:
(1)首先將運算元棧opval設為空棧,而將'#'作為運算子棧opter的棧底元素,這樣的目的是判斷表示式是否求值完畢。
(2)依次讀入表示式的每個字元,表示式須以'#'結尾,若是運算元則入棧opval,若是運算子,則將此運算子c與opter的棧頂元素top比較優先順序後執行相應的操作,(具體操作如下:(i)若top的優先順序小於c,即topc,則表明可以計算,此時彈出opval的棧頂兩個元素,並且彈出opter棧頂的的運算子,計算後將結果放入佔opval中。)直至opter的棧頂元素和當前讀入的字元均為'#',此時求值結束。
算符間的優先關係如下表所示:
具體**如下:
[cpp]view plain
copy
print?
#include//輸入的表示式要以'#'結尾,如『5+6*3/(3-1)#』
#include
#include
#include
#include
using
namespace std;
stack opter; //運算子棧
stack opval; //運算元棧
int getindex(char theta) //獲取theta所對應的索引
return index;
} char getpriority(char theta1, char theta2) //獲取theta1與theta2之間的優先順序
, ,
, ,
, ,
, };
int index1 = getindex(theta1);
int index2 = getindex(theta2);
return priority[index1][index2];
} double calculate(double b, char theta, double a) //計算b theta a
} double getanswer() //表示式求值
else
c = getchar();
} else
} } return opval.top(); //返回opval棧頂元素的值
} int main()
return 0;
}
#include//輸入的表示式要以'#'結尾,如『5+6*3/(3-1)#』
#include#include#include#includeusing namespace std;
stackopter; //運算子棧
stackopval; //運算元棧
int getindex(char theta) //獲取theta所對應的索引
return index;
}char getpriority(char theta1, char theta2) //獲取theta1與theta2之間的優先順序
, ,
, ,
, ,
, };
int index1 = getindex(theta1);
int index2 = getindex(theta2);
return priority[index1][index2];
}double calculate(double b, char theta, double a) //計算b theta a
}double getanswer() //表示式求值
else
c = getchar();
} else
}} return opval.top(); //返回opval棧頂元素的值
}int main()
return 0;
}
結果:
表示式求值 棧實現
宣告 僅個人小記 演算法思想 一 設定乙個運算子棧,設定乙個字尾表示式字串 二 從左到右依次對中綴表示式中的每個字元ch分別進行一下處理,直至表示式結束 1.若ch是左括號 將其入棧 2.若 ch 是數字,將其後連續若干數字新增到字尾表示式字串之後,在新增空格作為分割符 3.若ch是運算子,先將棧頂...
表示式求值 棧 用C 實現
1 include 2 3 include 4 5 include 6 7 include 8 9 include 10 11using namespace std 1213 1415 char precede char a,char b 2223 2425 2627 2829 3031 3233 ...
表示式求值(棧)
時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 acm隊的mdd想做乙個計算器,但是,他要做的不僅僅是一計算乙個a b的計算器,他想實現隨便輸入乙個表示式都能求出它的值的計算器,現在請你幫助他來實現這個計算器吧。比如輸入 1 2 4 程式就輸出1.50 結果保留兩位小數 輸入...