CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

求解......运算符优先法实现四则运算表达式

楼主firesgoo(思过,思过。。。。)2004-11-02 18:17:06 在 C/C++ / C++ 语言 提问

#include<iostream.h>  
  #include"stdio.h"  
  #include"malloc.h"  
  #define   STACK_INIT_SIZE   100;  
  #define   STACKINCRMENT       10;  
  ///////////////////////////////////////////////////////////////////////////////  
  template<class   exam>class   stack{  
  private:  
  exam   *   base;  
  exam   *   top;  
  int   stacksize;  
  public:  
  stack();  
  exam   Gettop(){   if(top   ==   base)     cout<<"ERROR"<<endl;   return   *(top-1);       }  
  void   push(exam   e);  
  exam   pop();  
  };///////////////////////////////////////////////////////////////////////////  
  template<class   exam>  
  stack<exam>::stack(){  
  //构造一个空的栈  
  base   =   (exam   *)   malloc(STACK_INIT_SIZE   *   sizeof(exam));  
  if(!base)   cout   <<   "ERROR"<<endl;  
  top   =   base;  
          stacksize   =   STACK_INIT_SIZE;  
  }/////////////////////////////////////////////////////////////////////////  
  template<class   exam>  
  void   stack<exam>::push(exam   e){  
  //插入E为新的元素  
  if(top   -   base     >=   stacksize){//栈满。追加存储空间  
  base   =   (exam   *)   realloc   (base,(stacksize   +   STACKINCRMENT)*sizeof(exam));  
          if(!base)   cout   <<   "ERROR"<<endl;  
  top   =   base   +   stacksize;  
  stacksize   +=   STACKINCRMENT;  
  }  
  *   top++   =   e;  
   
  }//push  
  template<class   exam>  
  exam   stack<exam>::pop(){  
          //若栈不空,则删除栈顶元素,并返回;  
  //     否则返回   ERROR  
          if(top   ==   base)     cout   <<   "ERROR"<<endl;  
  return   *   --top;  
  }  
  ////////////////////////////////////////////////////////////////////////  
  char   Precede(char   a,char   b){  
  switch(a){  
          case   '+':  
  case   '-':  
  switch(b){  
  case   '+':  
  case   '-':  
  case   ')':  
  case   '#':  
  return   '>';break;  
  case   '*':  
  case   '/':  
  case   '(':  
  return   '<';break;  
  }  
  case   '*':  
  case   '/':  
  if(   b   =='('   )   return   '<';  
  else   return   '>';  
  break;  
                  case   '('://假设#不会出现  
  if(   b   ==')'   )   return   '=';  
  else   return   '<';  
          break;  
  case   ')'://假设(不会出现  
  return   '>';   break;  
  case   '#'://假设)不会出现  
  if(   b==   '#'   )   return   '=';  
  else   return   '<';  
  break;  
  }  
  }//////////////////////////////////////////////  
  int   Operate(int   aa,char   temp,int   bb){  
  switch(temp){  
  case   '+':   return   (aa   +   bb);break;  
  case   '-':   return   (aa   -   bb);break;  
  case   '/':  
  return   (aa   /   bb);break;  
  case   '*':   return   (aa   *   bb);break;  
  }  
  }  
  template<class   exam>  
  void   main(){  
          //算术表达式求值优先算法。设OPTR和OPND分别为运算符栈和运算数栈,  
  stack<char>   OPTR;  
          stack<int> OPND;  
  OPTR.push('#');  
  cout   <<   "请输入表达式并以“#”开始和结束:"<<endl;  
  exam   c   =getchar();  
  char   temp;  
  int   aa,bb;  
  while(c   !=   '#'   ||   OPTR.Gettop()   !='#'){  
  if(sizeof(c)>1)   {   OPND.push(c);c   =   getchar();}   //不是运算符则进栈  
                  else  
  switch(Precede(OPTR.Gettop(),C)){  
                        case   '<':         //栈顶元素优先级低  
                  OPTR.push(c);       c   =   getchar();  
  break;  
                        case   '=':         //脱括号并接收下一字符  
                  OPTR.pop();   c   =   getchar();  
  break;  
                        case   '>':         //退栈并把运算结果入栈  
                  temp   =   OPTR.pop();  
          bb   =   OPND.pop()   ;  
  aa   =   OPND.pop()   ;  
  OPND.push(Operate(aa,temp,bb));  
  break;  
  }  
  }  
  cout   <<   "结果为:"<<endl;  
  cout   <<OPND.pop()<<ednl;  
   
  }  
   
  总是提示错误...  
  Linking...  
  LIBCD.lib(crt0.obj)   :   error   LNK2001:   unresolved   external   symbol   _main  
  Debug/表达式.exe   :   fatal   error   LNK1120:   1   unresolved   externals  
  Error   executing   link.exe. 问题点数:40、回复次数:6Top

1 楼goodluckyxl(被人遗忘的狗)回复于 2004-11-02 18:24:19 得分 5

搞的main都找不到了Top

2 楼imRainman(雨人)回复于 2004-11-02 19:02:37 得分 5

@_@Top

3 楼horisly(SUN YAT-SEN UNIVERSITY (逸仙先生))回复于 2004-11-02 19:09:49 得分 20

本人写的:  
   
   
  /***************************************************************/  
  /*                                                                                                                           */  
  /*                                                                                                                           */  
  /*                               Stack类模板(文件Stack.h)                                             */  
  /*                                                                                                                           */  
  /*                                                                                                                           */  
  /***************************************************************/  
   
  #include<iostream>  
  #include<conio.h>  
  #define   STACKSIZE   50  
   
  template<class   Type>                             //定义一个Stack的类模板  
  class   Stack{  
  private:  
  Type   buffer[STACKSIZE];       //开辟栈区  
  Type   *   sp;     //设置栈顶指针  
  public:  
  Stack(){  
  sp=buffer;  
  }  
  void   Empty()   {sp=buffer;}     //清空栈  
  bool   IsEmpty();                       //判断是否空栈  
  bool   IsFull();  
  void   Push(Type);                       //入栈  
  Type   Pop();                                 //弹出  
  Type   Top();  
  };  
   
   
  template<class   Type>                             //IsEmpty()  
  bool   Stack<Type>::IsEmpty(){  
  if(sp==buffer)  
  return   true;  
  else  
  return   false;  
  }  
   
  template<class   Type>                                 //IsFull()  
  bool   Stack<Type>::IsFull(){  
  if(sp>=buffer+STACKSIZE)  
  return   true;  
  else  
  return   false;  
  }  
   
  template<class   Type>                               //Push()  
  void   Stack<Type>::Push(Type   e){  
  if(IsFull())  
  cerr   <<   "Stack   overflow   !"   <<   endl;  
  else  
  *sp++=e;  
  }  
   
  template<class   Type>                                 //Pop()  
  Type   Stack<Type>::Pop(){  
  if(IsEmpty()){  
  cerr   <<   "Stack   is   Empty!"   <<   endl;  
  return   0;  
  }  
  else  
  return   *--sp;  
  }  
   
  template<class   Type>  
  Type   Stack<Type>::Top(){  
  if(IsEmpty()){  
  cerr   <<   "Stack   is   Empty!"   <<   endl;  
  return   0;  
  }  
  else  
  return   *(sp-1);  
  }  
   
   
   
   
  /******************************************************************/  
  /*                                                                                                                                 */  
  /*                                                                                                                                 */  
  /*                     简单计算器Calculator(文件Calculator.cpp)                     */  
  /*                                                                                                                                 */  
  /*                                                                                                                                 */  
  /******************************************************************/  
   
  #include<iostream.h>  
  #include<stdlib.h>  
  #include"Stack.h"  
   
  class   Calculator{  
  private:  
  Stack<long>   Nstack;                           //定义一个long型的数据栈  
  Stack<char>   Ostack;                           //定义一个char型的符号栈  
  public:  
  Calculator(){  
  cout<<"Calculate:   input   the   expression   and   end   the   expression   with   \'=\'   \n";  
  cout<<"Clear   the   Calculator's   stacks,input   a   \'C\'   \n";  
  cout<<"Close   the   Calculator,input   a   \'Z\'   \n   "   ;  
  }  
  char   Precede(char,char);             //用于比较前后两个符号的优先级                                      
  long   Operate(long,char,long);                 //从Nstack弹出的两个数的计算  
  void   Clear(); //清空两个栈  
  void   Cal();        
  };  
   
   
  void   Calculator::Clear(){  
  Nstack.Empty();  
  Ostack.Empty();  
  Ostack.Push('=');                                   //预置Ostack栈底元素为=  
  }  
   
  void   Calculator::Cal(){  
  bool   b1=true,b2;  
  char   ch,num[10];  
  int   k=-1;  
  char   op;  
  long   a,b;  
  Clear();  
  while(b1){  
  cin>>ch;  
  if(ch>='0'   &&   ch<='9'){  
  k++;  
  num[k]=ch; //数字字符插进串中  
  }  
  else{  
  if(k>=0){  
  num[k+1]='\0';  
  Nstack.Push(atol(num));  
  k=-1;  
  }  
   
  if(ch=='c'){                       //C字符表示清空栈  
  Clear();      
  continue;  
  }  
   
  if(ch=='z')   break;         //z字符结束计算器  
   
  b2=true;  
  while(b2){  
  if(   (ch=='=')   &&   (   Ostack.Top()   ==   '='   )   ){   //如果栈顶和ch都为=,表示已经全部计算完  
  cout<<Nstack.Pop()<<endl;  
  b2=false;  
  break;  
  }  
  switch(Precede(Ostack.Top(),ch)){     //与栈顶运算符比较优先级  
  case   '<'   :  
  Ostack.Push(ch);b2=false;  
  break;  
  case   '='   :  
  Ostack.Pop();b2=false;  
  break;  
  case   '>'   :  
  op=Ostack.Pop();  
  b=Nstack.Pop();  
  a=Nstack.Pop();  
  Nstack.Push(Operate(a,op,b));  
  break;  
  }   //switch;  
  }   //while(b);  
  }   //else;  
  }   //while(true);  
  }  
   
   
  char   Calculator::Precede(char   c1,char   c2){                   //比较c1与c2的优先级   c1在c2左边  
  switch(c1){  
  case   '+'   :  
  case   '-'   :  
  if(   (c2=='*')   ||   (c2=='/')   ||   (c2=='(')   )  
  return   '<';  
  else    
  return   '>';  
  case   '*'   :  
  case   '/'   :  
  if(   c2=='('   )  
  return   '<';  
  else  
  return   '>';  
  case   '('   :  
  if(   c2=')'   )  
  return   '=';  
  else  
  return   '<';  
  case   ')'   :  
  return   '>';  
  case   '='   :                          
  if(c2=='=')  
  return   '=';  
  else  
  return   '<';  
  }   //switch(c1);  
  }   //Precede()  
   
  long   Calculator::Operate(long   a,char   op,long   b){  
  switch(op){  
  case   '+'   :  
  return   (a+b);  
  case   '-'   :  
  return   (a-b);  
  case   '*'   :  
  return   (a*b);  
  case   '/'   :  
  return   (a/b);  
  }  
  }   //Operate()  
   
   
   
   
  /************************************************************/  
  /*                                                                                                                     */  
  /*             简单计算器的测试程序                                                                 */  
  /*                                                                                                                     */  
  /************************************************************/  
   
  #include"Calculator.cpp"  
  #include<iostream.h>  
   
  void   main(){  
  Calculator   expression;  
  expression.Cal();  
  cout<<endl;  
  }  
   
   
   
   
   
   
   
   
   
   
   
   
   
   
  Top

4 楼freefalcon(心宇—消失中...)回复于 2004-11-02 19:46:54 得分 10

template<class   exam>  
  void   main(){  
   
  @_@  
   
  main都被你模板化了,不知楼主怎么考虑的  
  将这个函数重命名,然后在main里调用该函数的一个实例Top

5 楼xMars(火星虫:最简单的人工智能)回复于 2004-11-02 20:15:28 得分 0

我把搂住的程序改了一下,编译没问题了,好像执行后结果不对  
   
   
   
  #include<iostream.h>  
  #include"stdio.h"  
  #include"malloc.h"  
  #define   STACK_INIT_SIZE   100;  
  #define   STACKINCRMENT       10;  
  ///////////////////////////////////////////////////////////////////////////////  
  template<class   exam>class   stack{  
  private:  
  exam   *   base;  
  exam   *   top;  
  int   stacksize;  
  public:  
  stack();  
  exam   Gettop(){   if(top   ==   base)     cout<<"ERROR"<<endl;   return   *(top-1);       }  
  void   push(exam   e);  
  exam   pop();  
  };///////////////////////////////////////////////////////////////////////////  
  template<class   exam>  
  stack<exam>::stack(){  
  //构造一个空的栈  
  base   =   (exam   *)   malloc(100   *   sizeof(exam));  
  if(!base)   cout   <<   "ERROR"<<endl;  
  top   =   base;  
          stacksize   =   STACK_INIT_SIZE;  
  }/////////////////////////////////////////////////////////////////////////  
  template<class   exam>  
  void   stack<exam>::push(exam   e){  
  //插入E为新的元素  
  if(top   -   base     >=   stacksize){//栈满。追加存储空间  
  base   =   (exam   *)   realloc   (base,(stacksize   +   10)*sizeof(exam));  
          if(!base)   cout   <<   "ERROR"<<endl;  
  top   =   base   +   stacksize;  
  stacksize   +=   STACKINCRMENT;  
  }  
  *   top++   =   e;  
   
  }//push  
  template<class   exam>  
  exam   stack<exam>::pop(){  
          //若栈不空,则删除栈顶元素,并返回;  
  //     否则返回   ERROR  
          if(top   ==   base)     cout   <<   "ERROR"<<endl;  
  return   *   --top;  
  }  
  ////////////////////////////////////////////////////////////////////////  
  char   Precede(char   a,char   b){  
  switch(a){  
          case   '+':  
  case   '-':  
  switch(b){  
  case   '+':  
  case   '-':  
  case   ')':  
  case   '#':  
  return   '>';break;  
  case   '*':  
  case   '/':  
  case   '(':  
  return   '<';break;  
  }  
  case   '*':  
  case   '/':  
  if(   b   =='('   )   return   '<';  
  else   return   '>';  
  break;  
                  case   '('://假设#不会出现  
  if(   b   ==')'   )   return   '=';  
  else   return   '<';  
          break;  
  case   ')'://假设(不会出现  
  return   '>';   break;  
  case   '#'://假设)不会出现  
  if(   b==   '#'   )   return   '=';  
  else   return   '<';  
  break;  
  }  
  return   0;  
  }//////////////////////////////////////////////  
  int   Operate(int   aa,char   temp,int   bb){  
  switch(temp){  
  case   '+':   return   (aa   +   bb);break;  
  case   '-':   return   (aa   -   bb);break;  
  case   '/':  
  return   (aa   /   bb);break;  
  case   '*':   return   (aa   *   bb);break;  
  }  
  return   -1;  
  }  
   
  void   main(){  
          //算术表达式求值优先算法。设OPTR和OPND分别为运算符栈和运算数栈,  
  stack<char>   OPTR;  
          stack<int> OPND;  
  OPTR.push('#');  
  cout   <<   "请输入表达式并以“#”开始和结束:"<<endl;  
  int   c   =getchar();  
  char   temp;  
  int   aa,bb;  
  while(c   !=   '#'   ||   OPTR.Gettop()   !='#'){  
  if(sizeof(c)>1)   {   OPND.push(c);c   =   getchar();}   //不是运算符则进栈  
                  else  
  switch(Precede(OPTR.Gettop(),c)){  
                        case   '<':         //栈顶元素优先级低  
                  OPTR.push(c);       c   =   getchar();  
  break;  
                        case   '=':         //脱括号并接收下一字符  
                  OPTR.pop();   c   =   getchar();  
  break;  
                        case   '>':         //退栈并把运算结果入栈  
                  temp   =   OPTR.pop();  
          bb   =   OPND.pop()   ;  
  aa   =   OPND.pop()   ;  
  OPND.push(Operate(aa,temp,bb));  
  break;  
  }  
  }  
  cout   <<   "结果为:"<<endl;  
  cout   <<OPND.pop()<<endl;  
   
  }  
   
   
  Top

6 楼xMars(火星虫:最简单的人工智能)回复于 2004-11-02 20:16:12 得分 0

揭帖so快  
  呵呵Top

相关问题

  • 不用四则运算符,判断个数的奇偶
  • 这个正则表达式怎么写?(四则运算式)
  • 如何写判断一个字符串是否符合一个四则运算式的正则表达式
  • 100分,请教,vb6 如何解释四则运算的表达式,支持扩号
  • 条件表达式中的自增运算符的问题
  • C# 含运算符的表达式比较 请高手指点!
  • 正则表达式求解!
  • C# 含运算符的表达式解析 请高手指点!急啊!
  • 正则表达式操作 求解~
  • 正则表达式疑惑求解

关键词

  • template
  • top
  • exam
  • stack
  • opnd
  • stacksize
  • optr
  • nstack
  • elsereturn
  • 入栈

得分解答快速导航

  • 帖主:firesgoo
  • goodluckyxl
  • imRainman
  • horisly
  • freefalcon

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo