一、实现一个计算器
使用两个栈:数字栈和符号栈
通过优先级的判断做出相应的操作。
“#”相当于在最外面加一对大括号,用其他符号也可以。
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int calculate(int a, int b, char c)
{
switch (c)
{
case '+':
return a + b;
case '-':
return a - b;
case '*':
return a*b;
case '/':
return a / b;
default:
return 0;
}
}
char compare(char a1, char a2)
{
if (a1 == '+'&&a2 == '+')return '>';
else if (a1 == '+'&&a2 == '-') return '>';
else if (a1 == '+'&&a2 == '*') return '<';
else if (a1 == '+'&&a2 == '/')return '<';
else if (a1 == '+'&&a2 == '(')return '<';
else if (a1 == '+'&&a2 == ')')return '>';
else if (a1 == '+'&&a2 == '#')return '>';
else if (a1 == '-'&&a2 == '+')return '>';
else if (a1 == '-'&&a2 == '-')return '>';
else if (a1 == '-'&&a2 == '*')return '<';
else if (a1 == '-'&&a2 == '/')return '<';
else if (a1 == '-'&&a2 == '(')return '<';
else if (a1 == '-'&&a2 == ')')return '>';
else if (a1 == '-'&&a2 == '#')return '>';
else if (a1 == '*'&&a2 == '+')return '>';
else if (a1 == '*'&&a2 == '-')return '>';
else if (a1 == '*'&&a2 == '*')return '>';
else if (a1 == '*'&&a2 == '/')return '>';
else if (a1 == '*'&&a2 == '(')return '<';
else if (a1 == '*'&&a2 == ')')return '>';
else if (a1 == '*'&&a2 == '#')return '>';
else if (a1 == '/'&&a2 == '+')return '>';
else if (a1 == '/'&&a2 == '-')return '>';
else if (a1 == '/'&&a2 == '*')return '>';
else if (a1 == '/'&&a2 == '/')return '>';
else if (a1 == '/'&&a2 == '(')return '<';
else if (a1 == '/'&&a2 == ')')return '>';
else if (a1 == '/'&&a2 == '#')return '>';
else if (a1 == '('&&a2 == '+')return '<';
else if (a1 == '('&&a2 == '-')return '<';
else if (a1 == '('&&a2 == '*')return '<';
else if (a1 == '('&&a2 == '/')return '<';
else if (a1 == '('&&a2 == '(')return '<';
else if (a1 == '('&&a2 == ')')return '=';
//else if (a1 == ')'&&a2 == '+')return '>';
//else if (a1 == ')'&&a2 == '-')return '>';
//else if (a1 == ')'&&a2 == '*')return '>';
//else if (a1 == ')'&&a2 == '/')return '>';
//else if (a1 == ')'&&a2 == ')')return '>';
//else if (a1 == ')'&&a2 == '#')return '>';
else if (a1 == '#'&&a2 == '+')return '<';
else if (a1 == '#'&&a2 == '-')return '<';
else if (a1 == '#'&&a2 == '*')return '<';
else if (a1 == '#'&&a2 == '/')return '<';
else if (a1 == '#'&&a2 == '(')return '<';
else if (a1 == '#'&&a2 == '#')return '=';
else return ' ';
}
bool isChar(char c)
{
if (c == '+' || c == '-' || c == '*' || c == '/' || c == '(' || c == ')' || c == '#')return true;
else return false;
}
int EvaluateExpression(string expression)
{
int result;
stack<int> numStack;
stack<char> charStack;
charStack.push('#');
unsigned int i = 0;
while (i < expression.length())
{
int temp = 0;
bool flag = false;
while (expression[i] >= '0' && expression[i] <= '9')
{
temp = temp * 10 + expression[i] - '0';
++i;
flag = true;
}
if (flag == true)
{
flag = false;
numStack.push(temp);
}
if (isChar(expression[i]))
{
switch (compare(charStack.top(), expression[i]))
{
case '<':
charStack.push(expression[i]);
++i;
break;
case '=':
charStack.pop();
++i;
break;
case '>':
int a = numStack.top();
numStack.pop();
int b = numStack.top();
numStack.pop();
char c = charStack.top();
charStack.pop();
result = calculate(b, a, c);
numStack.push(result);
break;
}
}
}
return numStack.top();
}
int main()
{
string a;
for (;;)
{
cout << "[0]退出程序\n[1]计算表达式" << endl;
int i;
cin >> i;
if (i == 0)break;
else
{
cout << "请输入要表达的计算式" << endl;
cin >> a;
a += '#';
cout << EvaluateExpression(a) << endl;
}
}
return 0;
}
二、中缀表达式的应用
华为的一道机试题:实现1和0之间的与或非计算(& | !)表达式中包含括号:
如:1|0=1 1&0=0 !0 =1
1|(1&0)=1
这道题输入的就是一个中缀表达式,注意这里有一个一元运算符,所以用了函数的重载
#include <iostream>
#include <string>
#include <stack>
using namespace std;
int calculate(int a, int b, char c)
{
switch (c)
{
case '|':
return a || b;
case '&':
return a && b;
default:
return 0;
}
}
int calculate(int a, char c)
{
return !a;
}
char compare(char a1, char a2)
{
if (a1 == '|'&&a2 == '|') return '>';
else if (a1 == '|'&&a2 == '&') return '>';
else if (a1 == '|'&&a2 == '!') return '<';
else if (a1 == '|'&&a2 == '(') return '<';
else if (a1 == '|'&&a2 == ')') return '>';
else if (a1 == '|'&&a2 == '#') return '>';
else if (a1 == '&'&&a2 == '|') return '>';
else if (a1 == '&'&&a2 == '&') return '>';
else if (a1 == '&'&&a2 == '!') return '<';
else if (a1 == '&'&&a2 == '(') return '<';
else if (a1 == '&'&&a2 == ')') return '>';
else if (a1 == '&'&&a2 == '#') return '>';
else if (a1 == '!'&&a2 == '|') return '>';
else if (a1 == '!'&&a2 == '&') return '>';
else if (a1 == '!'&&a2 == '!') return '>';
else if (a1 == '!'&&a2 == '(') return '<';
else if (a1 == '!'&&a2 == ')') return '>';
else if (a1 == '!'&&a2 == '#') return '>';
else if (a1 == '('&&a2 == '|') return '<';
else if (a1 == '('&&a2 == '&') return '<';
else if (a1 == '('&&a2 == '!') return '<';
else if (a1 == '('&&a2 == '(') return '<';
else if (a1 == '('&&a2 == ')') return '=';
else if (a1 == '#'&&a2 == '|') return '<';
else if (a1 == '#'&&a2 == '&') return '<';
else if (a1 == '#'&&a2 == '!') return '<';
else if (a1 == '#'&&a2 == '(') return '<';
else if (a1 == '#'&&a2 == '#') return '=';
else return ' ';
}
bool isChar(char c)
{
if (c == '|' || c == '&' || c == '!' || c == '(' || c == ')' || c == '#')return true;
else return false;
}
int EvaluateExpression(string expression)
{
int result;
stack<int> numStack;
stack<char> charStack;
charStack.push('#');
unsigned int i = 0;
while (i < expression.length())
{
int temp = 0;
bool flag = false;
while (expression[i] >= '0' && expression[i] <= '9')
{
temp = temp * 10 + expression[i] - '0';
++i;
flag = true;
}
if (flag == true)
{
flag = false;
numStack.push(temp);
}
if (isChar(expression[i]))
{
switch (compare(charStack.top(), expression[i]))
{
case '<':
charStack.push(expression[i]);
++i;
break;
case '=':
charStack.pop();
++i;
break;
case '>':
if (charStack.top() != '!')
{
int a = numStack.top();
numStack.pop();
int b = numStack.top();
numStack.pop();
char c = charStack.top();
charStack.pop();
result = calculate(b, a, c);
numStack.push(result);
break;
}
else
{
int a = numStack.top();
numStack.pop();
char c = charStack.top();
charStack.pop();
result = calculate(a, c);
numStack.push(result);
break;
}
}
}
}
return numStack.top();
}
int main()
{
string a;
for (;;)
{
cout << "请输入要表达的计算式:" << endl;
cin >> a;
a += '#';
cout << EvaluateExpression(a) << endl;
}
return 0;
}