改错求助: 用中缀 表达式求值 (路过请进)

程序如下.问题是 当计算乘方的时候无法显示结果(例如:3^3 得不出结果).请高手帮忙改错.

#include <iostream>
#include <stack>

using namespace std;

//定义"+" "-" "*" "/" 运算
 int yunsuan(int x,char op,int y)         
 {
 int sum=1;
  switch(op){
   case'+': return x+y;
   case'-': return x-y;
   case'*': return x*y;
   case'/': return x/y;
   case'^':
  for (int i=1;i<=y;i++)
   sum*=x;
   return sum;
  }
 }
 
 


 int youxianji(char op1,char op2) //op1和op2分别表示栈内外
 {
 
  if(((op1=='+'||op1=='-')&&(op2=='+'||op2=='-'||op2==')'||op2=='#'))||  //比较'+' '-'栈内外的优先级
  ((op1=='*'||op1=='/')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='#'))||      //比较'*' '/'栈内外的优先级
  ((op1=='^')&&(op2=='+'||op2=='-'||op2=='*'||op2=='/'||op2==')'||op2=='#')))
   return 1;     //op1>op2
  if((op1=='('&&op2==')')||(op1=='#'&&op2=='#'))
   return 0;   //op1==op2
  else
   return -1;   //op1<op2
 }


 void zhuanhua(char &c,stack<int> &STACK1)  //STACK1 运算数栈   函数将连续数字字符转化为数值
 {   int num=0;

  if(((c-'0')>=0&&(c-'0')<=9))
  {
   while(((c-'0')>=0&&(c-'0')<=9))
   {
    num=num*10+(c-'0');
    cin>>c;
   }
   STACK1.push(num);
  }
 
 }

int main()
{
 stack<char> STACK2;
 stack<int> STACK1;            //STACK1和STACK2表示运算数栈和运算符栈
 
 STACK2.push('#'); //'#'入栈底  当出栈时表示多项式结束
   
 char c,op1,op2,op;
 int x,y;
    cout<<"输入表达式,以'#'结束:";
 cin>>c;
 while(c!='#'||STACK2.top()!='#')
 {     
             zhuanhua(c,STACK1);                   //进入判断两位数以上的数字 并转化成数值
  if(c!='+'&&c!='-'&&c!='*'&&c!='/'&&c!='('&&c!=')'&&c!='#')
  {
   STACK1.push(c);  //当c为数值时候 入运算数栈
   cin>>c;
  }
  else //当c为运算符 比较栈内外优先级
  {
   op1=STACK2.top();
   op2=c;
   switch(youxianji(op1,op2))
   {
    case -1: //当栈外优先级高 入运算符栈
             STACK2.push(c);
          cin>>c; 
          break;    
    case 0: //脱括号并接受下一个字符
             STACK2.pop();
           cin>>c;
           break;
    case 1: op=STACK2.top(); //取栈顶运算符元素 且出栈
          STACK2.pop();
           x=STACK1.top(); //取栈顶运算数元素 且出栈
          STACK1.pop(); 
          y=STACK1.top();
          STACK1.pop();
          STACK1.push(yunsuan(y,op,x));    //计算求值 入栈         
          break;
   }
  }
 }
    cout<<"计算结果是:"<<STACK1.top()<<endl;
  return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值