中缀转后缀表达式并求值

简介:

通过栈将中缀表达式转换为后缀表达式并根据后缀表达式求解,包含的Header.h为之前发过的栈操作相关函数实例程序,改成头文件就行。练习+记录,高手无视。

OutPut:

The init formula:3+4*5+(6*7+8)*9
The stack is empty.
Convert result:345*+67*8+9*+
Calculate result:473

 
  1. //Code by Pnig0s1992  
  2. //Date:2012,3,21  
  3. #include <stdio.h>  
  4. #include <Windows.h>  
  5. #include "Header.h"  
  6.  
  7. #define MAXLENGTH 50  
  8.  
  9. VOID ConvertAndCalc(LPSTR lpContainer,Stack S);  
  10. int Caculate(LPSTR lpContainer,Stack S);  
  11. int getOptPriv(CHAR cOpt);  
  12.  
  13. int main(int argc,char **argv)  
  14. {  
  15.     LPSTR lpContainer = "3+4*5+(6*7+8)*9";  
  16.     Stack myStack = CreateStack();  
  17.     printf("\nThe init formula:%s",lpContainer);  
  18.     ConvertAndCalc(lpContainer,myStack);  
  19.     system("pause");  
  20.     return 0;  
  21. }  
  22.  
  23. int getOptPriv(CHAR cOpt)  
  24. {  
  25.     switch(cOpt)  
  26.     {  
  27.     case '(':  
  28.         return 7;  
  29.     case ')':  
  30.         return 7;  
  31.     case '*':  
  32.         return 5;  
  33.     case '/':  
  34.         return 5;  
  35.     case '+':  
  36.         return 3;  
  37.     case '-':  
  38.         return 3;  
  39.     default:  
  40.         return 0;  
  41.     }  
  42. }  
  43.  
  44. VOID ConvertAndCalc(LPSTR lpContainer,Stack S)  
  45. {  
  46.     LPSTR lpResult = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);  
  47.     LPSTR lpTemp = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);  
  48.     while(*lpContainer != '\0')  
  49.     {  
  50.         if(isalnum(*lpContainer))  
  51.         {  
  52.             sprintf(lpTemp,"%c",*lpContainer);  
  53.             strcat(lpResult,lpTemp);  
  54.             ZeroMemory(lpTemp,MAXLENGTH);  
  55.         }else 
  56.         {  
  57.             if(isEmpty(S))  
  58.             {  
  59.                 Push(*lpContainer,S);  
  60.             }else if (*lpContainer == ')')  
  61.             {  
  62.                 while(!isEmpty(S) && getTop(S) != '(')  
  63.                 {  
  64.                     sprintf(lpTemp,"%c",Pop(S));  
  65.                     strcat(lpResult,lpTemp);  
  66.                     ZeroMemory(lpTemp,MAXLENGTH);  
  67.                 }  
  68.                 Pop(S);  
  69.             }else 
  70.             {  
  71.                 if(getOptPriv(getTop(S)) < getOptPriv(*lpContainer))  
  72.                 {  
  73.                     Push(*lpContainer,S);  
  74.                 }else 
  75.                 {  
  76.                     while((!isEmpty(S)) && (getOptPriv(getTop(S)) >= getOptPriv(*lpContainer)) && getTop(S) != '(')  
  77.                     {  
  78.                         sprintf(lpTemp,"%c",Pop(S));  
  79.                         strcat(lpResult,lpTemp);  
  80.                         ZeroMemory(lpTemp,MAXLENGTH);  
  81.                     }  
  82.                     Push(*lpContainer,S);  
  83.                 }  
  84.             }  
  85.         }  
  86.         lpContainer++;  
  87.     }  
  88.     while(!isEmpty(S))  
  89.     {  
  90.         sprintf(lpTemp,"%c",Pop(S));  
  91.         strcat(lpResult,lpTemp);  
  92.         ZeroMemory(lpTemp,MAXLENGTH);  
  93.     }  
  94.     MakeEmpty(S);  
  95.     printf("\nConvert result:%s",lpResult);  
  96.     int iResult = Caculate(lpResult,S);  
  97.     printf("\nCalculate result:%d",iResult);  
  98.     return;  
  99. }  
  100.  
  101. int Caculate(LPSTR lpContainer,Stack S)  
  102. {  
  103.     int iTemp;  
  104.     int iResult;  
  105.     while(*lpContainer != '\0')  
  106.     {  
  107.         if(isdigit(*lpContainer))  
  108.         {  
  109.             LPSTR lpTemo = (LPSTR)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,MAXLENGTH);  
  110.             sprintf(lpTemo,"%c",*lpContainer);  
  111.             Push(atoi((const char *)lpTemo),S);  
  112.         }else 
  113.         {  
  114.             switch(*lpContainer)  
  115.             {  
  116.             case '+':  
  117.                 Push(Pop(S)+Pop(S),S);  
  118.                 break;  
  119.             case '-':  
  120.                 Push(Pop(S)-Pop(S),S);  
  121.                 break;  
  122.             case '*':  
  123.                 Push(Pop(S)*Pop(S),S);  
  124.                 break;  
  125.             case '/':  
  126.                 Push(Pop(S)/Pop(S),S);  
  127.                 break;  
  128.             default:  
  129.                 break;  
  130.             }  
  131.         }  
  132.         lpContainer++;  
  133.     }  
  134.     return Pop(S);  

 











本文转hackfreer51CTO博客,原文链接:http://blog.51cto.com/pnig0s1992/812563,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 分布式计算 数据处理
分布式计算框架:并行力量的交响乐章
分布式计算框架如Apache Spark解决单机计算挑战,通过拆分任务到多机并行处理提升效率。Spark以其内存计算加速处理,支持批处理、查询、流处理和机器学习。以下是一个PySpark统计日志中每日UV的示例,展示如何利用SparkContext、map和reduceByKey进行数据聚合分析。这些框架的运用,正改变大数据处理领域,推动数据分析和机器学习的边界。【6月更文挑战第18天】
528 2
|
网络协议 安全 Unix
深入剖析进程间通信:Unix 套接字、共享内存与IP协议栈的性能比较
深入剖析进程间通信:Unix 套接字、共享内存与IP协议栈的性能比较
444 2
|
SQL 运维 监控
关系型数据库性能监控工具
【5月更文挑战第21天】
327 2
|
SQL 存储 人工智能
OceanBase CTO杨传辉谈AI时代下数据库技术的创新演进路径!
在「DATA+AI」见解论坛上,OceanBase CTO杨传辉先生分享了AI与数据库技术融合的最新进展。他探讨了AI如何助力数据库技术演进,并介绍了OceanBase一体化数据库的创新。OceanBase通过单机分布式一体化架构,实现了从小规模到大规模的无缝扩展,具备高可用性和高效的数据处理能力。此外,OceanBase还实现了交易处理、分析和AI的一体化,大幅提升了系统的灵活性和性能。杨传辉强调,OceanBase的目标是成为一套能满足80%工作负载需求的系统,推动AI技术在各行各业的广泛应用。关注我们,深入了解AI与大数据的未来!
OceanBase CTO杨传辉谈AI时代下数据库技术的创新演进路径!
|
人工智能 数据挖掘 决策智能
跟着我的步骤,轻松打造出 AI 智能体
跟着我的步骤,轻松打造出 AI 智能体
557 3
跟着我的步骤,轻松打造出 AI 智能体
|
人工智能 JSON 文字识别
印刷文字识别使用问题之如何数电发票进行识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
机器学习/深度学习 存储 PyTorch
Pytorch-自动微分模块
PyTorch的torch.autograd模块提供了自动微分功能,用于深度学习中的梯度计算。它包括自定义操作的函数、构建计算图、数值梯度检查、错误检测模式和梯度模式设置等组件。张量通过设置`requires_grad=True`来追踪计算,`backward()`用于反向传播计算梯度,`grad`属性存储张量的梯度。示例展示了如何计算标量和向量张量的梯度,并通过`torch.no_grad()`等方法控制梯度计算。在优化过程中,梯度用于更新模型参数。注意,使用numpy转换要求先`detach()`以避免影响计算图。
248 10
|
小程序 Java 关系型数据库
基于Java微信小程序宠物店商城系统设计和实现(源码+LW+调试文档+讲解等)
基于Java微信小程序宠物店商城系统设计和实现(源码+LW+调试文档+讲解等)
|
分布式计算 Hadoop 大数据
数据工程师必须掌握的7个大数据实战项目
值得收藏,数据工程师必须掌握的7个大数据实战项目
8144 1
数据工程师必须掌握的7个大数据实战项目
|
Prometheus 监控 Cloud Native
Prometheus
Prometheus 是一款开源的监控和报警工具,可以用于监控各种类型的组件,例如应用程序、数据库、网络设备等等。它通过收集和处理指标来提供有关系统状态的实时和历史视图,并通过报警机制来通知管理员当系统出现异常时。
267 1