1.绘制基本流程图(如下)。
2.需要c++基础,进行简单计算器的代码编写工作,且输入的运算表达式还需要支持带括号“(”“)”。使用单栈法与队列结合的方式计算带符号优先级的算数结果。
3.需要学习相关的QT知识来实现计算器的界面设计。
代码参考:
#include<stack>
#include<iostream>
#include<deque>
#include<string>
using namespace std;
//判断是否为括号
bool isPra(char c)
{
if(c=='('||c==')')
return true;
else
return false;
}
//获得符号的优先性
int getPri(char c)
{
switch(c) //循环判断
{
case '+':
case '-':
return 0; //如果是加减,返回0
break;
case '*':
case '/':
return 1; //如果是乘除,返回1
break;
case '(':
case ')':
return -1; //注意,这里将括号设为最低优先级,因此括号不会被弹出,除非遇到右括号
break;
}
}
//判断符号的优先性
void check(char c, stack<char>& bbb, deque<char>& ccc)
{
if(bbb.empty())
{
bbb.push(c);
return;
}
if(isPra(c))
{
if(c=='(')
bbb.push(c);
else
{
//弹出所有元素直到遇到左括号
while(bbb.top()!='(')
{
char ch = bbb.top();
ccc.push_back(ch);
bbb.pop();
}
//当遇到左括号时,弹出但不加入ccc(后缀表达式中)
bbb.pop();
}
}
else //如果不是括号
{
//取出栈顶元素,与当前符号进行优先性比较
char sym = bbb.top();
//比较两符号的优先性
if(getPri(c)<=getPri(sym))
{
//如果c的优先性比栈顶符号小或等于,弹出栈顶元素
bbb.pop();
//并将其压入ccc(后缀表达式)中
ccc.push_back(sym);
//递归调用check,比较当前符号c与下一个栈顶符号的优先性
check(c,bbb,ccc);
}
else
{
//如果c比栈顶符号优先级大,那将c压入bbb(操作符栈)中
bbb.push(c);
}
}
}
//从aaa中取出元素,分配元素到bbb和ccc中
void allocate(deque<char>& aaa, stack<char>& bbb, deque<char>& ccc)
{
while(!aaa.empty())
{
char c = aaa.front();
aaa.pop_front();
if(c>='0'&&c<='9')
{
ccc.push_back(c);
}
else
{
//调用check函数,针对不同情况作出不同操作
check(c,bbb,ccc);
}
}
//如果输入结束,将bbb的元素全部弹出,加入后缀表达式中
while(!bbb.empty())
{
char c = bbb.top();
ccc.push_back(c);
bbb.pop();
}
}
//计算后缀表达式
void calculate(deque<char>& ccc, stack<int>& ddd)
{
while(!ccc.empty())
{
char c = ccc.front();
ccc.pop_front();
//如果是操作数,压入栈中
if(c>='0'&&c<='9')
{
int op = c-'0';
ddd.push(op);
}
else //如果是操作符,从栈中弹出元素进行计算
{
int op1 = ddd.top();
ddd.pop();
int op2 = ddd.top();
ddd.pop();
switch(c)
{
case '+':
ddd.push(op2+op1);
break;
case '-':
ddd.push(op2-op1);
break;
case '*':
ddd.push(op2*op1);
break;
case '/':
ddd.push(op2/op1); //注意是op2(op)op1而不是op1(op)op2
break;
}
}
}
}
int main()
{
deque<char> aaa; //盛放中缀表达式
stack<char> bbb; //盛放操作符
deque<char> ccc; //盛放后缀表达式
stack<int> ddd; //计算后缀表达式的辅助栈
string str;
cout<<"请输入表达式,按enter结束:"<<endl;
cin>>str;
for(int i=0;i!=str.size();++i)
{
//逐一加入每个字符
aaa.push_back(str[i]);
}
//从aaa中取出元素,分配元素到bbb和ccc中
allocate(aaa,bbb,ccc);
//计算后缀表达式
calculate(ccc,ddd);
cout<<"计算结果为:"<<ddd.top()<<endl;
system("pause");
return 0;
}