棧實現表示式求值(C

2021-08-19 21:17:55 字數 2166 閱讀 4062

為了實現用棧計算算數表示式的值,需設定兩個工作棧:用於儲存運算子的棧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 結果保留兩位小數 輸入...