|
本帖最后由 iptton 于 2009-3-28 10:03 编辑
#include <iostream>
#include <time.h>
using namespace std;
#define SIZE 100 //栈最大长度
#define OPR_LENGTH 6 //操作符个数
#define RESULT 100 //等式右边
#define OPR_TYPE_LENGTH 4 //操作符种类个数
double num_stack[SIZE]; //数字栈
char opr_stack[SIZE]; //操作符栈
int num_top = 0, opr_top = 0; //栈顶指针
char oprs[OPR_LENGTH + 1]; //存放操作符,一个单元格代表一个“口”
double numbers[OPR_LENGTH + 1] = {1, 23, 4, 56, 7, 8, 9}; //按顺序存放操作数
char opr_types[OPR_TYPE_LENGTH] = {'*', '/', '+', '-'}; //+ - * /
int run(); //主函数,递归用,作用是往“口”里面填操作符
int get_res(); //通过oprs和numbers获得结果
int compare(char opr1, char opr2); //比较两个操作符大小,opr1 > opr2 则返回1,opr1 = opr2 则返回0, 否则返回-1
int print(); //输出结果
double count(double left, char opr, double right); // 返回 a口b 的结果 具体原理见数据结构
int get_res() //计算表达式结果
{
//栈初始化
num_top = 0;
opr_top = 0;
double result = 0;
int i = 0; //i 当前处理的操作符
num_stack[num_top++] = numbers[0]; //第一个操作数进栈
oprs[OPR_LENGTH] = '#'; //用#标志结束
opr_stack[opr_top++] = '#'; //用#标志开始
while (opr_top != 0 || i < OPR_LENGTH)
{
int cmp = compare(opr_stack[opr_top - 1], oprs[ i ]);
if (cmp < 0) //栈空或者栈顶元素操作符低
{
num_stack[num_top++] = numbers[i+1];
opr_stack[opr_top++] = oprs[ i ];
i++;//继续处理下一个操作符
}
else if (cmp > 0) //如果小于则,退栈计算
{
char the_opr = opr_stack[--opr_top];
double right_num = num_stack[--num_top];
double left_num = num_stack[--num_top];
num_stack[num_top++] = count(left_num, the_opr, right_num);
}
else //否则,退栈
{
--opr_top;
}
}
result = num_stack[num_top - 1];
//print();
//cout << result << endl;
return result;
}
int print()
{
int i;
for (i = 0; i < OPR_LENGTH; i++)
{
cout << numbers[ i ] << oprs[ i ] ;
}
cout << numbers[ i ] << "=" << RESULT << endl;
return 0;
}
int run(int pos)
{
if (pos == OPR_LENGTH)
{
double res = get_res() -RESULT;
if (res >= -0.0001 && res <= 0.0001) //浮点数不能精确比较
{
print();
}
}
else
{
for (int i = 0; i < OPR_TYPE_LENGTH; i++)
{
oprs[pos] = opr_types[ i ];
run(pos + 1);
}
}
return 0;
}
double count(double left, char opr, double right)
{
//cout << left << opr << right << endl;
double result;
switch(opr)
{
case '*': result = left * right; break;
case '/': result = left / right; break;
case '+': result = left + right; break;
case '-': result = left - right; break;
}
return result;
}
int compare(char opr1, char opr2)
{
if (opr1 == '*' || opr1 == '/') //乘除法优先级最高
{
return 1;
}
else if (opr1 == '+' || opr1 == '-')
{
if (opr2 == '*' || opr2 == '/') //加减法优先级小于乘除法
{
return -1;
}
else
{
return 1;
}
}
else
{
if (opr2 == '#')
{
return 0;
}
else
{
return -1;
}
}
}
int main(int argc,char *argv[])
{
run(0);
return 0;
}
有代码的地方注意 [ i ] 下标会如果没有空格格开会被解析为斜体确良
--edit by iptton |
评分
-
1
查看全部评分
-
|