回 帖 发 新 帖 刷新版面

主题:急!!一个问了很多人都不知道那里错了的程序 程序虽多请有耐心的高手指点

我的程序是利用栈来实现四则运算 能通过编译但输入数据后回车就没有反映了
#include<string.h>
#include<cmath> 
#include <stdio.h>
#include<iostream.h>
const  int maxsize=100;
class seqstack
{  public :
      char stack[maxsize];
   int  top;
   void Inistack();
   void Push(char x);
   void Push(double x);//重载 
   void Pop(char &x);
   void Pop(double &x);
   void Gettop(char &x);
   void Gettop(double &x);
   bool Empty();
};
void seqstack::Inistack()
{  top=0; }
void seqstack::Push(char x)
{   if(top==maxsize)  cout<<"overflow";
    else stack[top++]=x;

}
void seqstack::Push(double x)
{   if(top==maxsize)  cout<<"overflow";
    else stack[top++]=x;

}
void seqstack::Pop(char &x)
{   
     if(top!=0) x=top--;
}
void seqstack::Pop(double &x)
{   
     if(top!=0) x=top--;
}
void seqstack::Gettop(char &x)

    x = stack[top];
}void seqstack::Gettop(double &x)

    x = stack[top];
}
bool seqstack::Empty()
{  if(top==0)  return true;
     else return false ;
}
char Procede(char t1,char t2 )//判断符号优先关系
{  char f; 
 switch(t2)
 {
   case'+': 
   case'-': if(t1=='('||t1=='=')  
                     f='<';
                else f= '>';
   case'*': 
   case'/': if(t1=='*'||t1=='/'||t1==')')
                     f= '>';
                else f= '<';
         
   case'('://if(t1==')')f= 0;
            //else
                     f='<';
   case')':switch(t1)
            {
                case'(': f='=';
                //case'=':cout<<"ERROR"<<endl;f= 0;
                default: f= '>';
            }
   case'=':switch(t1)
             {
                case'=':f= '=';
                //case'(':cout<<"ERROR"<<endl;f= 0;
                default:f= '>';
             }
    
 }
  return f;
}

bool In(char c)//判断是否为运算符 
{ switch(c)
    {  
      case'+':
      case'-':
      case'*':
      case'/':
      case'(':
      case')':
      case'=': return true;
      default: return false;
    }
}
double Operator(double a,char theta,double b)//计算

  double c;
    switch(theta)
      {  case'+':c=a+b;break;
         case'-':c=a-b;break;
         case'*':c=a*b;break;
         case'/':
         if(b==0) 
             cout<<"0 can't be divid!"; break;
                 c=a/b;break;//
      }
 return c;
}
double EvaluateExpression()//设置两个栈 ,并输入
{ seqstack OPTR ,OPND;
   char c,x1,theta,array[10]={'0'};double a,b,e=0,x2;
   OPTR.Inistack();
   //OPTR.Push('=');
   OPND.Inistack();
   c=getchar();
   OPTR.Gettop(x1);
  while(c!='='||x1!='=')
  { 
      if(In(c))
        
          switch(Procede(x1,c))
           {
             case'<': OPTR.Push(c);
                      c=getchar();
                      break;
             case'=': OPTR.Pop(x1);
                      c=getchar();
                      break;
             case'>': OPTR.Pop(theta);
                      OPND.Pop(b);                      
                      OPND.Pop(a);
                      OPND.Push(Operator(a,theta,b));
                      break;
          }
       
     else if(c>='0'&&c<='9')//字符串转为数字
      {   int i=0;
          do{           
            array[i]=c;
            i++;
            c=getchar();
           }while(c>='0'&&c<='9');
            array[i]=0;
            for(int j=0;j<i;j++)
            e+=(array[j]-'0')*pow(10,i-j-1);
            //e=chang(array);
            OPND.Push(e);
    
  }
     else {cout<<"非法字符"<<endl; break;}
     OPTR.Gettop(x1);
  }
  OPND.Gettop(x2);
  return x2;
}
void main()

 cout<<"请输入算术表达式,并以=结束"<<endl;
 cout<<"计算结果为:"<<EvaluateExpression()<<endl;

回复列表 (共10个回复)

沙发

我对C++不熟,但是主函数里好象有个错误,只有cout,没有cin,那你输入的表达式存哪了?

板凳

有输入的也就是这个函数c=getchar 他是取字符的功能

3 楼


有输入的也就是这个函数c=getchar 他是实现取字符的功能

4 楼

没仔细多看,但你的栈既存字符,又存实数,显然是不行的。

5 楼


但是我用了重载 阿 他会自动匹配的呀

6 楼

自动匹配有什么用?
你可以把double型赋给char数组吗?这会造成什么结果?

7 楼


我并没有将 double型赋给char数组  我只是在进站或gettop 时让他自动比配
比如我要取字符栈的顶元素则用 Gettop(char &x);要取double数据栈的顶元素
   则调用 Gettop(double &x);其他炒作一样
在如OPND.Push(e);e为由字符串转化而来即字符串123转为一个数字123并进数据栈

8 楼

循环读取字符时不要最好不要用getchar();它的实现机制是:一直输入,直到输入回车键,然后读取缓冲区最前面的字符,剩下的都还留着,最常见的是留着一个回车字符,然后循环再碰到getchar();时就自动读取回车字符而不等待输入.
可以用在getchar();前面加一个:
fflush(stdin);
删除残留的回车字符,这样就OK了.

9 楼

[quote]
我并没有将 double型赋给char数组  我只是在进站或gettop 时让他自动比配
比如我要取字符栈的顶元素则用 Gettop(char &x);要取double数据栈的顶元素
   则调用 Gettop(double &x);其他炒作一样
在如OPND.Push(e);e为由字符串转化而来即字符串123转为一个数字123并进数据栈
[/quote]


void seqstack::Push(double x)
{   if(top==maxsize)  cout<<"overflow";
    else stack[top++]=x;

}

你的stack定义为char型的,x为double型的。
显然,你把double型的值赋给了char数组

10 楼


fflush(stdin);我没有学过   这道题我已经调出来了
但还是谢谢你们 


我来回复

您尚未登录,请登录后再回复。点此登录或注册