返回顶部

收藏

表达式求值,可以处理带有负数的表达式,并且具有报错功能

更多

首先该程序来自书上数据结构中栈的应用。老师说有一年华工的什么考试考的就是表达式求值,所以产生了浓厚的兴趣。先照着书上的提示写了一个程序,但只能处理正数,无法 区分负号和减号,所以进行了改进,随即又发现一些错误不能处理,例如1++2,不会报错,所以又进行了一次改进,可以报错,发现表达式错误可以让用户重新输入。在这里 要感谢几个人,首先是我的一朋友,他不是学计算机的。书上表达式的以"#"结束,他问为什么不用"=“结束,我一下开窍,将“#"全部改为等号,还有他提出要有报错的 功能,还有我的老师给了很好的建议。

#include<iostream>
#include<windows.h> 
#include<stdlib.h>
using namespace std;
#define STACK_INIT_SIZE  100
#define STACKINCREMENT   20

typedef struct SqStack{
 int * base;
 int * top;
 int size;
}SqStack;

void InitSqStack(SqStack &t);
void push(SqStack &t, int n);
int out(SqStack &t);
int Empty( SqStack &t);
char GetTop(SqStack &t);
char Precede(char ,char);
void clearstack(SqStack &t);

int main(){
    SqStack OPTR;InitSqStack(OPTR);
    SqStack OPND;InitSqStack(OPND);
    printf("请输入表达式:\\0");
    while(1){
     char ch;
     clearstack(OPTR);
     clearstack(OPND);
     push(OPTR,'=');
     ch=getchar();
     if(ch=='-'){         //第一个数为负数
          int m=0;
          ch=getchar();
          while(ch<='9'&&ch>='0'){
            m=m*10+ch-48;
            ch=getchar();                           
          }
          push(OPND,m*(-1));
    }

     while(ch!=10){
            int m=0; int flag=1;   char ch3,ch4,ch5;
            char ch1=ch;
        if(ch1=='('){   
            char ch2;
            push(OPTR,ch);
            while((ch=getchar())=='(')
                 push(OPTR,ch);
            ch2=ch;
        if(ch2=='-'){                //出现负数
            flag=-1;
            ch=getchar();
           }

          if(ch2=='+')
               ch=getchar();

          if(ch2=='*'||ch2=='/')
           {
               MessageBox(NULL,TEXT("ERROR"),TEXT("xiaoxi"),0);
                                        //界面友好  重新输入

               printf("表达式有误\\0");
               fflush(stdin);   // 清空原来输入的东西
               system("cls");

               printf("请重新输入表达式:\\0");
               break;

           }

          while(ch<='9'&&ch>='0'){
             m=m*10+ch-48;
             ch=getchar();                           
          }

         if(ch==')')        //形如(-1)的负数 还有形如(-1+2*5  中的负数
         {
            out(OPTR);
            ch=getchar();   
         }
       }

      else { 
         while(ch<='9'&&ch>='0'){
          m=m*10+ch-48;
          ch=getchar();                           
         }
      }
    if(m)
         push(OPND,m*flag);

     ch3=GetTop(OPTR);
     ch4=Precede(ch3,ch);
     if(ch4){
         if(ch=='='&&(GetTop(OPTR))=='='){
             printf("%d",out(OPND));
             getchar();
             getchar();

             return 0;
         }
        switch(ch4){
                  case '<':push(OPTR,ch);ch=getchar();ch4=ch; break;
                  case '=':out(OPTR);ch=getchar();break;
                  case '>':{
                      int m2=out(OPND),m1=out(OPND); 
                         //注意m1和m2的顺序  后一个操作数先出来用m2接收
                      switch(out(OPTR)) {
                                   case '+':push(OPND,m1+m2);break;
                                   case '-':push(OPND,m1-m2);break;
                                   case '*':push(OPND,m1*m2);break;
                                   case '/':push(OPND,m1/m2);break;
                      }  

                           }  break;
        }
        if(ch4=='*'||ch4=='/'||ch4=='+'||ch4=='-')
           {
               MessageBox(NULL,TEXT("ERROR"),TEXT("xiaoxi"),0)   ; 
                                       //界面友好  重新输入
                        printf("表达式有误\\0");
               fflush(stdin);   // 清空原来输入的东西
               system("cls");
               printf("请重新输入表达式:\\0");
               break;
          }

    }

     else break;
   }
  }

     printf("%d",out(OPND));
     getchar();
     getchar();
     getchar();
     return 0;

}

void push(SqStack &t, int n){               
 if((t.top-t.base)>=t.size){
  t.base=(int *)realloc(t.base,(t.size+STACKINCREMENT)*sizeof(int));
  if(!t.base)
   exit(1);
 }
  *(t.top)=n;
     t.top++;

}         

int out(SqStack &t){             
 t.top--;
 return *(t.top);
}           

int Empty( SqStack &t){
 int m=(t.top-t.base);  
 return m;
}   

char GetTop(SqStack &t){
   return *(t.top-1);
}      

char Precede(char c,char d)
{
    char youxian[7][7]=
    {
        {'>','>','<','<','<','>','>'},
        {'>','>','<','<','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'>','>','>','>','<','>','>'},
        {'<','<','<','<','<','=','>'},
        {'>','>','>','>','>','>','>'},
        {'<','<','<','<','<','>','='}
    };
    char opt[7]={'+','-','*','/','(',')','='};
    int m,n,i;
    for(i=0;i<7;i++)
    {
        if(c==opt[i])
        {
            m=i;
        }
        if(d==opt[i])
        {
            n=i;
        }
    }

    if(m>=0&&m<7&&n>=0&&n<7)
          return youxian[m][n];
    else{
        MessageBox(NULL,TEXT("ERROR"),TEXT("xiaoxi"),0)   ;
                                      //界面友好  重新输入
        printf("表达式有误\\0");
        fflush(stdin);   // 清空原来输入的东西
        system("cls");
        printf("请重新输入表达式:\\0");
        return 0;
   }
}

void InitSqStack(SqStack &t){
 t.base=(int *)(malloc(sizeof(int)*STACK_INIT_SIZE)); 
 if(!t.base)
   exit(1);
 t.top=t.base;
 t.size=STACK_INIT_SIZE;
}  

void clearstack(SqStack &t){
    t.top=t.base;
}
//该片段来自于http://outofmemory.cn

标签:c++,基础

收藏

0人收藏

支持

0

反对

0

相关聚客文章
  1. tanglei 发表 2014-05-28 15:08:01 struct与class区别联系
  2. 博主 发表 2016-06-28 05:17:59 Bazel C++ 基础[翻译]
  3. 博主 发表 2011-11-03 16:00:00 C++ 语言基础
  4. thinkpc 发表 2016-03-04 13:55:30 c++&nbsp;11 map基础value排序
  5. pansunyou 发表 2014-11-30 02:51:00 C++通用跨数据库访问方案之一: 基础组件cdbc
  6. linux@linux.cn (linu 发表 2016-11-04 02:37:00 C++ 程序员 Protocol Buffers 基础指南
  7. Qiang 发表 2011-09-08 14:06:35 Lexing Python Indentation using Spirit.Lex
  8. One Coder 发表 2013-01-26 14:53:18 C++ 语法特性学习小记
  9. mortoray 发表 2013-03-25 04:27:22 Why do we need pointers/references?
  10. Herb Sutter 发表 2012-06-05 19:10:01 GotW #105: Smart Pointers, Part 3 (Difficulty: 7/1
  11. Herb Sutter 发表 2012-11-06 21:11:12 Friday’s Q&A session now online
  12. Boris Kolpackov 发表 2012-11-22 12:15:22 ODB 2.1.1 Released

发表评论