中缀表达式转化为后缀表达式,并计算后缀表达式

//头文件
//该函数中用了栈的特点,所以增加了栈的头文件,下面是栈的头文件
#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; } 
                  
                 
                
               
              
             
            
           
          
         
       
      
      
     
     
    
    
   
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值