//头文件
//该函数中用了栈的特点,所以增加了栈的头文件,下面是栈的头文件
#ifndef STACK_H
#define STACK_H
template
class Stack{
private:
const static int maxSize = 100;
T data[maxSize];
int top;
public:
Stack();
bool empty();
T gettop();
void Push(const T value);
int Length(){
return top;
}
T Pop();
};
template
Stack
::Stack()
{
this->top = 0;
}
template
bool Stack
::empty() { return top == 0 ? true : false; } template
T Stack
::gettop() { if (empty()) { cout << "弹出操作不合格,栈为空!" << endl; exit(1); } return data[top - 1]; } template
void Stack
::Push(const T value) { if (top == maxSize) { cout << "栈已满!" << endl; exit(1); } data[top++] = value; } template
T Stack
::Pop() { if (empty()) { cout << "删除操作不合格,栈为空!" << endl; exit(1); } T value = data[top - 1]; top--; return value; } #endif //该头文件,是处理中缀表达式转化为后缀表达式,并计算后缀表达式 #ifndef CALCULATE_H #define CALCULATE_H #include
#include
#include"stack.h" using namespace std; class Calculate{ private: //利用数组来存储表达式 char Infix[100]; char Postfix[100]; public: void setInfix(); //判断是否为运算符 bool isOperator(char str); //给出栈内运算符的优先级 int Priority(char str); //给出栈外运算符优先级 int OutPriority(char str); //把中缀表达式转化为后缀表达式 void PostFix(); //把数字字符串转化为相应的数字 int StringToNumber(char str[],int* n); //计算后缀表达式 int Value(); void print(){ cout << Postfix<< endl; } }; int Calculate::OutPriority(char str) { switch (str) { case ')': return 1; case '+':case '-': return 2; case '*':case '/': return 4; case '(': return 8; case '#': return 0; default: return -1; } } int Calculate::Priority(char str) { switch (str) { case '#': return 0; case '(': return 1; case '+': case '-': return 3; case '*': case '/': return 5; case ')': return 8; default: return -1; } } void Calculate::setInfix() { cout << "请输入正确的表达式(以#结束)"; cin >> Infix; cout << Infix << endl; } bool Calculate::isOperator(char str) { switch (str) { case '+': case '-': case '*': case '/': return true; break; default: return false; break; } } void Calculate::PostFix() { setInfix(); int i = 0, j = 0; Stack
Operation;//存储运算符的栈 Operation.Push('#');//以‘#’作为标记 while (Infix[i] != '#') { //如果是数字直接放在后缀表达式中,如果是左括号则直接放在运算符栈中 if (Infix[i] >= '0'&&Infix[i] <= '9') Postfix[j++] = Infix[i]; else if (Infix[i] == '(') Operation.Push(Infix[i]); else if (Infix[i] == ')') { //如果是右括号则将符号栈中不是左括号的运算符,不停地出栈, //直至遇到左括号,停止出栈,并将左括号弹出栈 while (Operation.gettop() != '(') { Postfix[j++] = Operation.Pop(); } Operation.Pop(); } else if (isOperator(Infix[i])) { int value = OutPriority(Infix[i]); int value1 = Priority(Operation.gettop()); while (value<=value1) { //如果栈外优先级不高于栈内优先级,则将栈内运算符不停的出栈,知道不符合条件 Postfix[j++] = Operation.Pop(); value1 = Priority(Operation.gettop()); } Postfix[j++] = ' ';//用空格来分开操作数 //栈运算符入栈 Operation.Push(Infix[i]); } i++; } while (!Operation.empty()) { Postfix[j++] = Operation.Pop(); } Postfix[j] = '\0'; } int Calculate::StringToNumber(char str[],int* n) { int value = 0; //如果队头是数字,则不停的进行此操作 while (str[*n] >= '0'&&str[*n] <= '9') { value = value * 10 + (str[*n] - '0'); (*n)++; } return value; } int Calculate::Value() { int i = 0; Stack
Operator;//操作数的栈 int data, data1; while (Postfix[i]!='#') { //开始读取后缀表达式 if (Postfix[i] >= '0'&&Postfix[i] <= '9') Operator.Push(StringToNumber(Postfix, &i)); else if (Postfix[i] ==' ') i++; else if (Postfix[i] == '+') { data = Operator.Pop(); data1 = Operator.Pop(); int value = data + data1; Operator.Push(value); i++; } else if (Postfix[i] == '-') { data = Operator.Pop(); data1 = Operator.Pop(); int value = data1 - data; Operator.Push(value); i++; } else if (Postfix[i] == '*') { data = Operator.Pop(); data1 = Operator.Pop(); int value = data * data1; Operator.Push(value); i++; } else if (Postfix[i] == '/') { data = Operator.Pop(); data1 = Operator.Pop(); int value = data1 / data; Operator.Push(value); i++; } } return Operator.gettop(); } #endif //主函数 #include"Calculate.h" int main(int argc, char argv[]) { Calculate test; test.PostFix(); test.print(); /*test.PostFix(); test.print();*/ int result = test.Value(); cout << "结果是:" << result << endl; return 0; }
中缀表达式转化为后缀表达式,并计算后缀表达式
最新推荐文章于 2021-04-07 12:24:01 发布