上篇写了MFC界面搭建,这篇写实现计算。涉及到数据结构,对新手很不友好。

一些园友在参考本文进行实现时遇到一些问题,程序有些老了,没有进行修正,源码在gitee可下<https://gitee.com/foxerz2077/mfc/tree/master/>C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式。程序程序最后处理CString和char[]有些问题,VS2017可以正常处理,有些版本的IDE不支持这里的处理方法,需要了解CString和 char *之间的转换,作为一个参考方法,博客内有再提到这个。

 

这虽然是MFC程序,但是能灵活地分离后台代码,自行构建控制台程序,本文的程序一开始只是个“黑框框”程序,后来把代码包装进了MFC。代码里有些预处理宏定义等没有加上,需要根据需求改动一下。

上篇文章链接: 

概要:

  1. 中缀表达式与后缀表达式
  2. 栈的相关实现
  3. 用栈将中缀表达式转换成后缀表达式
  4. 用栈计算后缀表达式 
  5. 等号按钮功能,显示计算结果

中缀表达式与后缀表达式

中缀:(60-20)/(5-1)。小学就学的东西

后缀:60 20 – 5 1 - /,为增加可读性,以“#”做分隔符,60#20#-#5#1#-#/。

后缀计算:从左到右遇到符号就计算符号左边的两个数并写上新值,即优先的运算符相对在左。上例中遇到第一个‘-’算60-20得40,遇到第二个“-”计算5-1得4,遇到“/”计算30/3的10,结果是10。

对比:中缀式人看起来方便,后缀式没有括号,计算顺序从前到后,用计算机操作起来的逻辑简单。

栈的相关实现

输入的值都是字符,所以需要一个字符结构的栈;在计算数时还需要一个处理数字结构的栈。

字符和数值的栈结构体分别命名SqStack和SqStackN。

然后实现栈初始化、进栈、出栈等栈的操作函数。

在工程中,同时把栈结构体和操作函数声明在新建的头文件xxx.h中,或者工程中其他头文件如stdafx.h,新建一个cpp文件实现函数体。

这里的栈和操作函数是自己动手定义的,可以直接用STL中的栈,使用比较方便。

栈内数据用的是 char ,在最后处理CString时可能会因IDE不支持导致出错,需要了解CString与char *之间的转换,我找了一篇比较详细的博客CString用法总结

C++做四则运算的MFC计算器(二)栈转换和计算后缀表达式
 1 struct SqStack {
 2     char data[maxsize];
 3     int top;
 4 };
 5 struct SqStackN {
 6     double data[maxsizen];
 7     int top;
 8 };
 9 //栈操作函数—字符
10 void initStack(SqStack *&s);
11 bool Push(SqStack *&s, char e);
12 bool Pop(SqStack *&s, char &e);
13 bool GetTop(SqStack *s, char &e);
14 void DestroyStack(SqStack *&s);
15 bool StackEmpty(SqStack *s);
16 //栈操作函数—数字
17 void initStack(SqStackN *&s);
18 bool Push(SqStackN *&s, double e);
19 bool Pop(SqStackN *&s, double &e);
20 bool GetTop(SqStackN *s, double &e);
21 void DestroyStack(SqStackN *&s);
22 bool StackEmpty(SqStackN *s);
23 
24 //后缀表达式转换函数
25 void trans(char* exp, char postexp[]);
26 //计算后缀表达式函数
27 double calculate(char* postexp);
头文件主要声明

相关文章:

  • 2021-04-15
  • 2022-12-23
  • 2021-07-14
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-01-07
  • 2021-12-15
  • 2022-12-23
  • 2021-05-30
  • 2021-11-27
  • 2021-05-12
  • 2022-12-23
相关资源
相似解决方案