栈的应用―中缀转后缀求表达式值(二)

2014-11-24 08:28:38 · 作者: · 浏览: 1
缀的表达式存放在字符数组中,便于后缀计算
void Calculator::exchange_exp()
{
Stack stk_char;//栈 用于存放操作符 并处理他们的优先级
stk_char.push('#');//先把 标准字符压栈
char isp_ch;//栈内 字符临时变量
string::size_type i=0;
while((stk_char.isEmpty()==false) && (i
{
if(is_numelem(expression_str[i]))//如果是操作数 输出到字符容器中
{
char_elem.push_back(expression_str[i]);
i++;
}
else
{
isp_ch = stk_char.Get_topelem();//弹出栈顶操作符与待进栈的作比较
if(Get_icp(expression_str[i]) > Get_isp(isp_ch))
{
stk_char.push(expression_str[i]);//如果待进栈的优先级高则入栈
i++;
}
else if(Get_icp(expression_str[i]) < Get_isp(isp_ch))
{
char_elem.push_back(stk_char.pop());
}
else
{
if(stk_char.pop() == '(')
i++;
}
}
}
}
//数值型字符转换为数字
float Calculator::exchange_num(char num_ch)
{
switch(num_ch)
{
case'0':
return 0; break;
case'1':
return 1; break;
case'2':
return 2; break;
case'3':
return 3; break;
case'4':
return 4; break;
case'5':
return 5; break;
case'6':
return 6; break;
case'7':
return 7; break;
case'8':
return 8; break;
case'9':
return 9; break;
}
}
//运算函数 并输出结果
void Calculator::Running()
{
exchange_exp();//转换表达式
for(vector::size_type i=0;i
{
switch(char_elem[i])
{//当遇到操作符后作出判断
case'+':case'-':case'*':case'/':
{
Do_Operator(char_elem[i]);//根据操作符并取栈头两个元素计算并把并把结果压栈
continue;
}
//当不为操作符时
default:
{
if(is_numelem(char_elem[i]))//判断是否为数字型字符
{
stk_float.push(exchange_num(char_elem[i]));//转换为数字后压栈
continue;
}
else
{
//当运行到此说明有非法字符或是程序未定义的字符 导致运算无法继续进行
cout<<"不合法的字符出现 导致运算出错 建议清栈 重新输入 并检查表达式的合法性"<
exit(1);
}
}
}//开关语句后括号
}//for结构后括号
Show_result();//显示结果
}
//从栈中取出左和右操作数 用于计算
bool Calculator::Get_operands(float &left_optnum,float &right_optnum)
{
if(stk_float.isEmpty())//判栈空
{
cout<<"缺少右操作数"<
return false;
}
right_optnum = stk_float.pop();//取右操作数
if(stk_float.isEmpty())//取出一个右操作数后 再次作出判断
{
cout<<"缺少左操作数"<
return false;
}
left_optnum = stk_float.pop();//取出左操作数
return true;//返回true
}
//根据操作符 去栈中去取两个元素计算
void Calculator::Do_Operator(char opt_ch)
{
float left,right,value;
if(Get_operands(left,right))//栈中取出头两个元素
{
switch(opt_ch)
{
case'+':
{
value = left + right;
stk_float.push(value);//相加后结果压栈
break;
}
case'-':
{
value = left - right;
stk_float.push(value);//相减 压栈
break;
}
case'*':
{
value = left * right;
stk_float.push(value);//相乘 压栈
break;
}
case'/':
if(right == 0)