目录

  • 编写思路
    • 1.策略
    • 2.实现
  • 代码实现
  • 主要问题
  • 测试

编写思路

1.策略

分别定义两个栈用于存储数字、运算符,对运算符评定优先级。遍历输入的字符串,计算相应乘除后分别存储于相应栈内,再以先进后出的规则依次运算至数字栈内只有一个数字,即为运算结果。

1)对数字的处理:将char型数字转为float型数字并入栈。

2)对运算符的处理:根据情况决定是否将该运算符用于计算。
(1)若运算符栈内为空(读入第一个运算符),不运算,入栈。
(2)若该运算符优先级高于前一运算符优先级,不运算,入栈。
(3)若该运算符优先级不高于前一运算符优先级,运算。
(4)若为最后一个读入的运算符且运算符栈内不为空,运算。

2.实现

1)利用类“MyStack”实现堆栈,功能包括:入栈、出栈、栈空;

2)利用函数“int priority(char a,char b)”判断运算符优先级

3)利用函数“float calculate(MyStack *a)”实现对栈

代码实现

主函数:

#include <iostream>
#include <string>
#include "MyStack.h"
using namespace std;int main()
{//1.储存运算式char exp[100];int i;for(i=0;i<100;i++)exp[i]='\0';cout<<"表达式为:"<<endl;cin>>exp;//cout<<exp<<endl;MyStack a;while(a.n_IsEmpty() == 0){a.n_Pop();}while(a.c_IsEmpty() == 0){a.c_Pop();}//2.判断数字/运算符i=0;while(exp[i] != '\0'){if(exp[i]>='0'&& exp[i]<='9')//是数字{float t = 0;t = exp[i]-'0';a.n_Push(t);//cout<<"将数字压入栈内"<<t<<endl;}else if(exp[i] == '+' || exp[i] == '-'|| exp[i] == '*'|| exp[i] == '/' || exp[i] == '\0' )//是运算符{//3.判断是否可以进行运算if(a.c_IsEmpty() ==1 || (!priority(exp[i-2],exp[i]))){if(exp[i] == '-'){exp[i] = '+';a.c_Push(exp[i]);i++;float temp = 0;temp = '0' - exp[i];a.n_Push(temp);}else{a.c_Push(exp[i]);}//cout<<"将运算符压入栈内"<<endl;}else if((exp[i] == '\0' && a.c_IsEmpty() == 0) || priority(exp[i-2],exp[i])){float res = 0;res = calculate(&a);a.n_Push(res);//cout<<"将数字压入栈内"<<res<<endl;if(exp[i] == '-'){exp[i] = '+';a.c_Push(exp[i]);i++;float temp = 0;temp = '0' - exp[i];a.n_Push(temp);}else{a.c_Push(exp[i]);}//cout<<"将运算符压入栈内"<<endl;}}i++;}//4.运算while (a.c_IsEmpty() == 0)//运算符栈内可能有不止一个运算符{//cout<<"遍历结束后运算符栈内仍有元素进入计算"<<endl;float resultend;resultend = calculate(&a);//printf("TEMPRESULT:%.2f\n",TempResult);//beizhu!a.n_Push(resultend);//cout<<"将数字压入栈内"<<resultend<<endl;}cout<<"最终运算结果为:"<<a.n_Pop()<<endl;system("pause");return 0;}

判断运算符优先级函数:

#include <iostream>
#include <string>
#include "MyStack.h"
using namespace std;int priority(char a,char b)//判断运算符优先级
{if(a =='*'||a =='/'||b =='+'||b =='-')return 1;elsereturn 0;
}

计算栈内两数并压回函数:


float calculate(MyStack *a)
{float result=0,p1=0,p2=0;char c1;p2=a->n_Pop();p1=a->n_Pop();c1=a->c_Pop();//cout<<"计算:"<<p1<<" "<<p2<<" "<<c1<<endl;switch(c1){case '+':result = p1 + p2;break;case '-':result = p1-p2;break;case '*':result = p1*p2;break;case '/':result = p1/p2;break;}//cout<<"计算结果为:"<<result;return result;
}

栈的头文件:


#pragma onceclass MyStack
{public:char c_space[100];float n_space[100];int c_top,n_top;void c_Push(char x);void n_Push(float x);char c_Pop();float n_Pop();int c_IsEmpty();int n_IsEmpty();MyStack(void);virtual ~MyStack(void);
};

栈的源文件:


#include "MyStack.h"
#include <string>MyStack::MyStack(void)
{c_top = -1;n_top = -1;int i;for(i=0;i<100;i++){c_space[i]='\0';n_space[i]=0;}
}MyStack::~MyStack(void)
{}void MyStack::c_Push(char x)
{c_top++;c_space[c_top] = x;
}void MyStack::n_Push(float x)
{n_top++;n_space[n_top] = x;
}char MyStack::c_Pop()
{char tc = c_space[c_top];c_top--;return tc;
}
float MyStack::n_Pop()
{float tn = n_space[n_top];n_top--;return tn;
}int MyStack::c_IsEmpty()
{return c_top == -1;
}int MyStack::n_IsEmpty()
{return n_top == -1;
}

主要问题

  1. 字符串数组初始化:
    char exp[100];
    int i;
    for(i=0;i<100;i++) exp[i]='\0';
    或直接:
    char exp[100] = {0};

  2. 从输入对字符串数组赋值

  3. 出栈与入栈:
    一般遵循“先移动,再操作”的原则,将栈顶指针初值设为“-1”。

注意:在调试过程中,想利用输出查看栈内值,不要直接调用出栈,若直接调用,会在查看后栈内该值丢失。

  1. “-”减号
    由于运算式子中的运算符与数字单独储存,在该策略下,加减的运算为从右往左,会出现运算“1-2+3”时顺序为“1-(2+3)”的错误,故将减法数组以负数的形式存储,减号以加号存储,以解决该问题。

     if(exp[i] == '-'){exp[i] = '+';a.c_Push(exp[i]);i++;float temp = 0;temp = '0' - exp[i];a.n_Push(temp);}
    

测试

输入:1+2*3-4/5+6
输出:

Visual Studio2008c++怎么用两个栈实现个位数计算器相关推荐

  1. 剑指offer:面试题09. 用两个栈实现队列

    题目:用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有 ...

  2. 面试题6:用两个栈实现队列

    思路:设置两个栈stack1和stack2,stack1实现入队列功能,stack2实现出队列功能. (1)入队列:入栈stack1 (2)出队列:若stack2不空,则直接弹出stack2中的栈顶元 ...

  3. 剑指offer_第5题_用两个栈实现队列

    题目描述 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 理解 关于栈 什么是栈 栈的抽象数据类型 Python实现栈 关于队列 什么是队列 队列抽象数据类型 Pyt ...

  4. 化栈为队(两个栈来实现一个队列)

    实现一个MyQueue类,该类用两个栈来实现一个队列. 示例: MyQueue queue = new MyQueue();queue.push(1); queue.push(2); queue.pe ...

  5. 栈与队列2——两个栈组成队列

    题目 编写一个类,用两个栈实现一个队列,并实现队列的基本操作(add,poll,peek) 思路 一个栈stackPush作为正常压入的栈,一个栈stackPop作为弹出的栈,将stackPush中的 ...

  6. c语言Inqueue函数用法,C语言用两个栈实现队列(完整版)

    队列是一种 先进先出(first in - first out, FIFO)的数据结构,队列中的元素都从后端(rear)入队(push),从前端(front)出队(pop). 实现队列最直观的方法是用 ...

  7. [剑指offer] 用两个栈实现队列

    本文首发于我的个人博客:尾尾部落 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 两个栈 stack1 和 stack2: push 动作都在 ...

  8. 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...

    多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...

  9. 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java

    <LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...

最新文章

  1. 基于新型忆阻器的存内计算原理、研究和挑战
  2. Android应用在不同版本间兼容性处理
  3. Python数据结构与算法(第六天)
  4. 国际电信联盟(ITU)发布最新IDI指数
  5. 图像多分类——卷积神经网络
  6. 给老板做PPT必备:文字加拼音
  7. Android studio设置相机权限,如何强制将“android.permission.CAMERA”权限添加到Codename中的清单中...
  8. 安卓 spinner下拉框 做模糊查询_SEO数据查询工具
  9. JenkinsDay18-查看服务器有哪些JOB
  10. C. Oh Those Palindromes
  11. 图像预处理第1步:将256色图像转化为灰度图像
  12. JavaScript的RegExp实例方法exec()
  13. 伦敦时间现在几点_伦敦现在几点
  14. 基于Python的豆果网食谱数据爬取及可视化分析系统
  15. Kotlin自定义android 控件
  16. 词向量与词意-Glo Ve
  17. 全新圣诞节头像框制作生成微信小程序源码下载支持多模板
  18. App打开小程序,小程序打开App
  19. mysql查询男生基本情况_MYSQL查询操作 详细
  20. 分享微信答题抽奖小程序制作步骤_可以做答题后抽奖活动吗

热门文章

  1. 绘画教程:如何画出挂住的衣服褶皱?
  2. 全开源java电商小程序saas项目介绍
  3. Linux C调用Python 函数
  4. 昆山中学高考2021成绩查询,2019年昆山高考成绩再创新高
  5. OpenCV 张正友标定法的实现
  6. c语言基础循环程序设计,C语言编程新手入门基础——循环详解!
  7. 追忆我的2008-爱上读书篇
  8. 笨办法14提示和传递
  9. jrebel debug模式无效
  10. 买了个云服务器怎么使用?只需三步骤就可以建站