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


在很多数据结构的经典教材中都提到了如何求解复杂表达式的问题,核心是堆栈的设计和算符优先级的设计。我用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++程序实现复杂表达式的计算问题_第1张图片

你可能感兴趣的:(用C++程序实现复杂表达式的计算问题)