用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:算法测试


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


程序计算结果:


相关文章推荐

任务安排问题C++程序实现

  • 2013年04月01日 20:14
  • 88KB
  • 下载

子集和数问题 C++程序实现 回溯

/* Function : 求子集和数问题 * Author : wyh7280 * Time : 2015.05.20 10:16:00.000 * Note ...
  • wyh7280
  • wyh7280
  • 2015年05月20日 10:27
  • 1007

c++程序实现c++代码相似度计算

  • 2016年07月05日 09:49
  • 1.11MB
  • 下载

C/C++程序实现通过http代理访问网页内容

公司通过代理上网,C程序直接通过发http请求不能获取网页内容,故实现了下通过代理访问http网页的一个测试程序。 程序很简单,有几个重点 先通过socket直接连接代理服务器...
  • big_bit
  • big_bit
  • 2016年06月30日 16:38
  • 1339

按照高等代数的传统解法编写c++程序实现N(N<256)元的线性方程组的求解

#include#include #include using namespace std; void solution1(double [][256],int,int,string); void s...

用C++语言程序实现拉格朗日插值公式

C程序实现Lagrange插值公式

【项目总结(一)】---视频摘要matlab的程序实现几个问题的总结

Q1:matlab视频播放时,怎么将所有视频转换成matlab可以播放的视频? A1: 1.matalb中函数aviread对读取avi的视频比较苛刻,aviread支持无压缩格式的avi和 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:用C++程序实现复杂表达式的计算问题
举报原因:
原因补充:

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