由於**中的注釋已較為詳盡,在此就只貼**了
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 思路 遇到數字直接入數字棧。遇到運算子,第乙個運算子直接入符號棧,後面的需要與符號棧棧頂元素比較優先順序。若當前優先順序...