用棧實現表示式計算 C

2021-06-28 01:47:44 字數 3353 閱讀 6630

思路:

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,也叫逆波蘭式 是最容易計算的,這種表示式中已經不含括號.方法 遇到運算元時壓入棧中 遇到操作符時從棧中彈出兩個元素進行此運算,再將運算結...