鏈式棧實現四則運算,表示式可包含括號,可計算小數

2021-10-02 14:44:18 字數 2857 閱讀 3519

由於**中的注釋已較為詳盡,在此就只貼**了

exprcpro.cpp 

#include "pch.h"

#include"expr.h"

#include using namespace std;

int main()

; cin >> expr;

cout << "最後的計算結果為:" << endl;

cout << parse(expr);

return 0;

}

expr.h(標頭檔案)

#includeusing namespace std;

//運算元棧

typedef struct stacknodeopnd

*opnd;

//操作符棧

typedef struct stacknodeoptr

*optr;

int init(opnd& opnd);//初始化運算元棧函式

int init(optr& optr);//初始化操作符棧函式

int push(opnd& opnd, double value);//入運算元棧

int push(optr&optr, char c);//入操作符棧

double parse(const char expr);//解析表示式,將運算元和操作符分別壓入運算元棧和操作符棧

int gettop(optr&optr, char&c);//獲得操作符棧的棧頂操作符

char preorder(char a, char b);//比較當前運算子和棧頂運算子的優先順序

int pop(optr&optr, char &c);//運算子棧頂元素出棧,並獲取棧頂元素

int pop(opnd&opnd, double &value);//運算元棧頂元素出棧,並獲取棧頂元素

double cal(double a, double b, char op);//計算函式

bool isempty(optr&optr);//判斷運算子棧中是否還有運算子

expr.cpp

#include"expr.h"

int init(opnd& opnd)

opnd = null;

return 0;

}int init(optr& optr)

optr= null;

return 0;

}//入運算元棧函式

int push(opnd& opnd, double value)

temp->value = value;

temp->next = opnd;

opnd = temp;

return 0;

}//入操作符棧函式

int push(optr& optr, char c)

temp->op = c;

temp->next = optr;

optr= temp;

return 0;

}//彈出操作符棧頂元素,並同時獲取棧頂元素

int pop(optr&optr, char& c)

optr temp = optr;

c = optr->op;

optr = optr->next;

delete(temp);

return 0;

}int pop(opnd&opnd, double &value)

opnd temp = opnd;

value = temp->value;

opnd = opnd->next;

delete(temp);

return 0;

}//解析表示式

double parse(const char expr)

; int j = 0;

while ((expr[i + j] > '0'&&expr[i + j] < '9') || expr[i + j] == '.')

i = i + j - 1;

token[j] = '\0';

double value = atof(token);

push(opnd, value);

} else

}else

} }if (!isempty(optr))

double result = 0;

pop(opnd, result);

return result;

}int gettop(optr&optr, char&c)

c = optr->op;

return 0;

}//a是棧頂操作符,b是當前操作符

char preorder(char a, char b) ,//+

,//-

,//*

,// /

,//(

// )

}; int x=-1, y = -1;

char allch[7] = "+-*/()";

for (int i = 0; i < 6; i++)

if (b == allch[i])

} return compre[x][y];

}double cal(double a, double b, char op)

} return result;

}bool isempty(optr&optr)

else

return 0;

}

最後執行效果為:

棧 四則運算表示式實現

棧的乙個常見應用,四則運算表示式求值。主要有兩個步驟 1,中綴轉字尾 2,字尾求值 實現起來比較簡單,我通過c 的容器stack實現一遍。從左到右遍歷中綴表示式的每個數字和符號,若是數字就輸出,即稱為字尾表示式的一部分,若是符號,則判斷其與棧頂符號的優先順序,是右括號或優先順序低於棧頂符號 乘除優先...

四則運算表示式求值

03 四則運算表示式求值 輸入輸入為四則運算表示式,僅由陣列 四則運算符 左右括號組成,不含空格。假設運算子結果都是整數。輸出輸出這個表示式的值 分析首先我們要搞清楚表示式的定義是什麼 表示式 由乙個或者多個項組成,多個項的表示式由 連線 項 由乙個或者多個因子組成,多個因子由 連線 因子 由 表示...

四則運算表示式求值

表示式求值是關於棧的應用,涉及到中綴與字尾式的轉換,本文關於10以內不帶括號的四則運算。9 3 4 x 3 24 1 x 9 5 9 9 5 x 9 4 6 2 x 3 1 42 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...