四则运算
2016-03-12 19:05 真白新宇 阅读(313) 评论(0) 编辑 收藏 举报string InfixToPostfix(std::string infix)
{ char current = 0;//读入的字符
std::string postfix;//写入后缀表达式的字符串
SqStack<char> mark;//符号入栈
InitStack(&mark);
std::map<char,int> priority;//运算符号优先级表
priority['+'] = 0;
priority['-'] = 0;
priority['*'] = 1;
priority['/'] = 1;
for(int i = 0;i<infix.length();++i)//逐个读取中缀表达式字符串中的字符
{
current =infix[i];
switch(current)
{ case '0':case '1':case '2':case '3':case '4':case '5': case '6':case '7':case '8':case '9':case '.':
postfix.push_back(current);//如果是数字的话直接写入输出字符串。
break;
case '+':case '-':case '*':case '/': if(infix[i-1] != ')') postfix.push_back(';');//如果运算符的前一项不是右括号即说明前一个数字输入完毕,用;标识前面几个字符组成一个数字。
if(!IsEmpty(mark))//如果符号栈非空,即比较目前符号与栈顶符号优先级,低于等于出栈,并写入输出字符串。
{ char tempTop;
GetTop(mark,tempTop);
while(tempTop != '(' && priority[current]<=priority[tempTop])
{ char tempOut;
Pop(&mark,&tempOut);
postfix.push_back(tempOut);
if(IsEmpty(mark))//如果栈为空,跳出while循环 break;
GetTop(mark,tempTop);
}
}
Push(&mark,current);//符号全部出栈或者遇到了'('或者大于栈顶符号的优先级,将新符号压入栈中。 break; case '(':
Push(&mark,current);//左括号直接入栈 break; case ')':
postfix.push_back(';');//右括号说明前方数字输入完成,标识一下。
char tempTop;
GetTop(mark,tempTop);
while(tempTop !='(')//直到栈顶元素是左括号才停止循环
{ char tempOut; Pop(&mark,&tempOut);
postfix.push_back(tempOut);//出栈并写入输出字符串中。
GetTop(mark,tempTop);
}
char tempOut;
Pop(&mark,&tempOut);//直接将左括号出栈。
break;
default:
break;//忽略其他字符。
} }
if(infix[infix.size()-1] != ')') postfix.push_back(';');//中缀表达式最后一个是数字需要加上;标识其是一个数字的结束,便于计算时统一识别数字结束。 while(!IsEmpty(mark))//如果栈非空,全部出栈并写入输出字符串。
{ char tempOut;
Pop(&mark,&tempOut);
postfix.push_back(tempOut);
}
return postfix;//返回后缀表达式。
}
然后计算后缀表达式:
- ///计算后缀表达式结果
- //输入为后缀表达式s,逐个读取字符,如果是数字即放入存放当前数字的字符串中,遇到“;”即将此字符串转换为float,
- //使用std::atof(),参数接受const char*类型,字符串需使用.c_str()转化。
- //完成数字识别转化后入栈,遇到符号即取出栈顶的两个数字计算,结果入栈。
- //栈中最后的元素即为结果。
- float Compute(std::string s)
- {
- SqStack<float> waitForCompute;
- SqStack<float>* ptWait = &waitForCompute;
- InitStack<float>(ptWait); //使用栈记录等待计算的数
- std::string strNum;
- float currNum = 0;
- float temNum1 = 0;
- float temNum2 = 0;
- for(std::string::const_iterator i = s.begin();i<s.end();++i)
- {
- switch(*i)
- {
- case '0':case '1':case '2':case '3':case '4':case '5':
- case '6':case '7':case '8':case '9':case '.':
- strNum.push_back(*i);
- break;
- case '+':
- Pop(ptWait,&temNum1);
- Pop(ptWait,&temNum2);
- Push(ptWait, temNum2 + temNum1);
- break;
- case '-':
- Pop(ptWait,&temNum1);
- Pop(ptWait,&temNum2);
- Push(ptWait, temNum2 - temNum1);
- break;
- case '*':
- Pop(ptWait,&temNum1);
- Pop(ptWait,&temNum2);
- Push(ptWait, temNum2 * temNum1);
- break;
- case '/':
- Pop(ptWait,&temNum1);
- Pop(ptWait,&temNum2);
- Push(ptWait, temNum2 / temNum1);
- break;
- case ';':
- currNum = std::atof(strNum.c_str());//字符串转换为浮点型。
- strNum.clear();
- Push(ptWait,currNum);
- break;
- }
- }
- Pop(ptWait,&currNum);
- return currNum;