思路:
1.首先建立倆個棧,乙個存資料(datastack),另乙個存運算子(operatorstack)
2.表示式計算: 資料->datasatck,運算子->operatorstack
if(當運算子棧為空時)
將第乙個運算子放入棧中
else if(此時的運算子的優先順序 >棧頂的運算子優先順序)
運算子入棧
else
把棧頂運算子和兩個資料傳入到計算函式,然後從棧中彈出,最後將計算後的資料再放入datastack,
if(當表示式全部分析完)
輸出datastack的最後乙個資料(棧頂),這就是表示式的最終結果啦!!
3. 資料轉換:因為表示式最初是以string型別存放的,所以需要將string類的資料轉換成int or double
while(1)
data = data *10 + expression[i] -'0';
i ++;
}
以下是**實現:
operatorstack.h
#ifndef __calculator__operator__h
#define __calculator__operator__h
#include #include typedef char opertype;
struct node1 //鏈棧節點
;class operatorstack
;#endif
operatorstack.cpp
#include "operatorstack.h"
#include using namespace std;
operatorstack::operatorstack()
operatorstack::~operatorstack()
}void operatorstack::push_operator_stack(opertype var)
void operatorstack::pop_operator_stack()
opertype operatorstack::stacktop()
bool operatorstack::is_empty_operator_stack()
datastack.h
#ifndef calculator_datastack_h
#define calculator_datastack_h
typedef int datatype;
struct node //鏈棧節點
;class datastack
;#endif
datastack.cpp
#include "datastack.h"
#include using namespace std;
datastack::datastack()
datastack::~datastack()
}void datastack::push_data_stack(datatype var)
void datastack::pop_data_stack()
datatype datastack::stacktop()
bool datastack::isempty()
calculator.h
#ifndef __experssion__calculator__h
#define __experssion__calculator__h
#include #include #include #include "operatorstack.h"
#include "datastack.h"
using namespace std;
class calculator
void run();
int j=0;
};#endif
calculator.cpp
#include "calculator.h"
#include "operatorstack.h"
#include #include calculator::calculator(string str)
void calculator::data_store(string str)
void calculator::dealwith()
else if (get_icp(expression[i]) < get_isp(ch_p))
else}}
else
oper.push_operator_stack(expression[i]);
}else
data = data * 10 + expression[i] - '0';
i ++;
}num.push_data_stack(data);
i--;}}
//返回最後乙個運算子並計算
while(!oper.is_empty_operator_stack())
}//返回將要入棧的操作符優先順序
int calculator::get_icp(char ch)
if (ch == '(')
if (ch == '*' || ch == '/')
if (ch == '+' || ch == '-')
if (ch == ')' )
return p;
}//此時棧頂的操作符優先順序
int calculator::get_isp(char ch)
if (ch == '(')
if (ch == '*' || ch == '/')
if (ch == '+' || ch == '-')
if (ch == ')' )
return p;
}//計算
int calculator::calcu_exp(datatype num1, datatype num2, char ch)
main.cpp
#include #include #include #include "calculator.h"
using namespace std;
int main()
用棧實現表示式計算
public class calculator public static inthandle string express else else else else int num integer.parseint keepnum keepnum numstack.push num index if...
C 用棧計算表示式
基本思路 1 設定兩個棧,乙個運算子棧,乙個運算元棧。初始化後將 壓入操作符棧中。2 順序掃瞄 當輸入為運算元時就將其壓入運算元棧。當輸入為運算子時,則比較輸入運算子和運算子棧的棧頂運算子的優先順序的大小。若輸入運算子的優先順序高於運算子棧頂運算子的優先順序時,則將其壓入到運算子棧 若運算子棧頂運算...
用棧計算表示式
首先宣告我們的表示式 expression 只是簡單的四則運算,再加上小括號.運算元operand,操作符operator 如果直接給出字尾表示式 postfix,也叫逆波蘭式 是最容易計算的,這種表示式中已經不含括號.方法 遇到運算元時壓入棧中 遇到操作符時從棧中彈出兩個元素進行此運算,再將運算結...