1、不带括号的四则运算
引用自博客:面试题45:字符串四则运算的实现
题目:有字符串表示的一个四则运算表达式,要求计算出该表达式的正确数值。
说明:
- 四则运算即加减乘除"±*/"
- 该表达式中的数字只能是1位(数值范围0~9)
- 另若有不能整除的情况,按向下取整处理,eg: 8/3得出值为2。
例如:若有字符串"8+7*2-9/3",计算出其值为19。
代码:
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
#include <assert.h>
int cal(int nNum1, char op, int nNum2)
{
if(op == '+')
{
return nNum1 + nNum2;
}
if(op == '-')
{
return nNum1 - nNum2;
}
if(op == '*')
{
return nNum1 * nNum2;
}
if(op == '/')
{
return nNum1 / nNum2;
}
}
int calculate(int len, char *expstr)
{
assert(expstr);
if(len < 3)
{
return -1;
}
char *p = expstr;
int nNum1 = p[0] - '0';
char op = p[1];
int nNum2 = p[2] - '0';
p += 3;
while(*p)
{
if(*p=='*' || *p=='/')
{
if(op =='*' || op=='/')
{
nNum1 = cal(nNum1, op, nNum2);
op = *p;
nNum2 = p[1] - '0';
}
else
{
nNum2 = cal(nNum2, *p, p[1]-'0');
}
}
else
{
nNum1 = cal(nNum1, op, nNum2);
op = *p;
nNum2 = p[1] - '0';
}
p += 2;
}
return cal(nNum1, op, nNum2);
}
int main()
{
//char str[] = "1+2*3/5-6*7";
//char str[] = "8+7*2-9/3";
char str[] = "3/2*2+3*4";
int res = calculate(strlen(str), str);
printf("result: %d\n", res);
}
2、带括号的四则运算
引用自博客:C/C++带括号四则运算
(1).首先从string读入表达式,取出每一个字符后装入deque容器coll1中(源码在后面)。
(2).从该容器取出每一个元素,利用栈将中缀表达式转换成后缀表达式(可参考:http://blog.csdn.net/anye3000/article/details/7939203),将后缀表达式装入容器coll3中。
(3).最后从coll3中取出元素逐一处理,既使用逆波兰式求值(如下图)。
#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>& coll2, deque<char>& coll3)
{
if(coll2.empty())
{
coll2.push(c);
return;
}
if(isPra(c))
{
if(c==