用C++程序实现复杂表达式的计算问题

原创 2013年12月06日 13:01:45


在很多数据结构的经典教材中都提到了如何求解复杂表达式的问题,核心是堆栈的设计和算符优先级的设计。我用BCB6实现了这个问题,简单的谈一下我的思路。


Step-1:设计堆栈结构,双向链表。


Struct LinkingStack

{

      String  data;

      LinkingStack   *front;   //前指针

      LingkingStack   *next;    //后指针

}


Step-2:创建三个堆栈,字符串堆栈Base,算符堆栈=baseOS,操作数堆栈=baseNS


LinkingStack *Base=new LinkingStack;

LinkingStack *baseNS=new LinkingStack;

LinkingStack *baseOS=new LinkingStack;


设置游标指针:

Linking *p=Base;

Linking *NS=baseNS;

Linking *OS=baseOS;


Step-3:算法实现


3.1 算法的总体结构设计



3.2  对Block-1的程序描述


1)当出现第一种情况:不执行计算操作,只执行OS堆栈的退栈操作


    #
# do  
)   do

   if((y=="#" && x=="#")||(y=="(" && x==")"))
       {
           OS=OS->front;
           OS->next=NULL;
           goto flag1;

      }


2)当出现第二种情况:执行计算操作,NS、OS两个堆栈同时执行退栈操作


  + - * /
    )  do    do   do   do  
   # do do do do
   + do do do do
    - do do do do
   *     do do
   /     do do


   if    ((y=="*" && x=="/")||(y=="/" && x=="/")||(y=="/" && x=="*")||(y=="*" && x=="*")||(y=="-" && x=="-")||
          (y=="+" && x=="-")||(y=="-" && x=="+")||(y=="+" && x=="+")||(y=="*" && x=="+")||(y=="*" && x=="-")||
          (y=="/" && x=="+")||(y=="/" && x=="-")||(y=="+" && x==")")||(y=="-" && x==")")||(y=="*" && x==")")||
          (y=="/" && x==")")||(y=="+" && x=="#")||(y=="-" && x=="#")||(y=="*" && x=="#")||(y=="/" && x=="#"))
       {

              int x1=StrToInt(NS->front->data);
             int x2=StrToInt(NS->data);
             int result;


             if(OS->data=="+")
             {


                 result=x1+x2;
                 NS->front->data=IntToStr(result);
                 NS->front->next=NULL;
                 NS=NS->front;


                 OS=OS->front;
                 OS->next=NULL;


                 goto flag1;


              }


               if(OS->data=="-")
             {


                 result=x1-x2;
                 NS->front->data=IntToStr(result);
                 NS->front->next=NULL;
                 NS=NS->front;


                 OS=OS->front;
                 OS->next=NULL;


                 goto flag1;


              }


               if(OS->data=="*")
             {


                 result=x1*x2;
                 NS->front->data=IntToStr(result);
                 NS->front->next=NULL;
                 NS=NS->front;


                 OS=OS->front;
                 OS->next=NULL;


                 goto flag1;


              }


               if(OS->data=="/")
             {


                 result=x1/x2;
                 NS->front->data=IntToStr(result);
                 NS->front->next=NULL;
                 NS=NS->front;


                 OS=OS->front;
                 OS->next=NULL;


                 goto flag1;


              }
        }
   //************************************************


3.3  Block-2的程序描述。

 

if(x=="+" || x=="-" || x=="*" || x=="/" || x=="#" ||x=="("||x==")")
        {


             LinkingStack *q=new LinkingStack;


             q->data=p->next->data;
             q->next=NULL;
             q->front=OS;
             OS->next=q;


             OS=OS->next;
             p=p->next;


         }else{


             LinkingStack *q=new LinkingStack;


             q->data=p->next->data;
             q->next=NULL;
             q->front=NS;
             NS->next=q;


             NS=NS->next;
             p=p->next;
         }
   //*********************************************


3.4 当字符串遍历完毕以后,while循环结束。NS堆栈的栈顶元素就是整个表达式的计算结果,返回字符串和计算结果并在主窗口显示


String result_all="";


   while(p->next)
   {


      result_all=result_all+p->next->data;
      p=p->next;


   }


   result_all=result_all+" = "+NS->data;


   return result_all;

//*****************************************************


Step-4:算法测试


输入一个表达式的字符串,“#”开始“#”结束。


程序计算结果:


Python3.5计算器之复杂表达式运算

一、需求 有这么一个表达式:1 - 2 * ((60-30 +(-40.0/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3...
  • colby_chenlun
  • colby_chenlun
  • 2017年07月12日 13:59
  • 460

C++用栈计算表达式

用STL中的栈作为工具,实现表达式的计算
  • yj3254
  • yj3254
  • 2015年02月10日 17:30
  • 856

用栈实现表达式计算——C++

思路:         1.首先建立俩个栈,一个存数据(DataStack),另一个存运算符(OperatorStack)         2.表达式计算:  数据->DataSatck,运算符->O...
  • never_ever_ydy
  • never_ever_ydy
  • 2015年01月06日 16:07
  • 1856

计算复杂数学表达式的值

S = (2^2/(1*3))*(4^2/(3*5))*.....(2n)^2*(2n-1)*(2n+1) 例如,输入n = 100时,函数的值为1.566893 代码如下: #include ...
  • yang6464158
  • yang6464158
  • 2014年03月02日 16:30
  • 811

计算器C++代码实现—— 中缀表达式的计算

中缀表达式的计算                                (包含“+ - * / ^ ()”)   这次的程序目的是要将一个中缀表达式转化为后缀表达式并计算,我用两个栈来实现...
  • u013708970
  • u013708970
  • 2014年04月06日 11:47
  • 3583

Java字符串算数表达式求值

原文地址:http://blog.csdn.net/yhhazr/article/details/7947962 [java] view plain copy ...
  • tanga842428
  • tanga842428
  • 2016年10月13日 21:52
  • 706

算术表达式的计算(基于逆波兰表达式)的c++实现

以字符串的形式输入一个算术表达式,如何对其进行识别并计算出结果呢?       如果按照普通的算术表达式计算,由于需要考虑到操作符和括号的优先级,实现起来十分麻烦。但是基于逆波兰表达式(也称后缀表达式...
  • llc3239
  • llc3239
  • 2015年09月26日 14:17
  • 878

C++用后缀表达式(逆波兰)求四则表达式值,采用STL中的stack

C/C++计算四则运算表达式的值
  • guo8113
  • guo8113
  • 2014年09月10日 10:17
  • 2584

面向对象表达式计算器源码分享

分享一个面向对象表达式计算器的源码,里面几乎涉及到了C++的所有知识,是一个很值得学习的小项目。我在里面做了一些我的注释和理解(这个计算器并不是我写的,我也是学习。) 百度云:http://pan....
  • qq_18297675
  • qq_18297675
  • 2016年05月01日 17:34
  • 906

表达式计算(C++版)

//虽然遇到了很多困难,但还是坚持了下来,用到了STL中的栈。 #include #include #include using namespace std; template void ...
  • u011877621
  • u011877621
  • 2014年12月07日 20:10
  • 4290
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C++程序实现复杂表达式的计算问题
举报原因:
原因补充:

(最多只允许输入30个字)