Visual Studio2008c++怎么用两个栈实现个位数计算器
目录
- 编写思路
- 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;
}
主要问题
字符串数组初始化:
char exp[100];
int i;
for(i=0;i<100;i++) exp[i]='\0';
或直接:
char exp[100] = {0};
从输入对字符串数组赋值
出栈与入栈:
一般遵循“先移动,再操作”的原则,将栈顶指针初值设为“-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++怎么用两个栈实现个位数计算器相关推荐
- 剑指offer:面试题09. 用两个栈实现队列
题目:用两个栈实现队列 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有 ...
- 面试题6:用两个栈实现队列
思路:设置两个栈stack1和stack2,stack1实现入队列功能,stack2实现出队列功能. (1)入队列:入栈stack1 (2)出队列:若stack2不空,则直接弹出stack2中的栈顶元 ...
- 剑指offer_第5题_用两个栈实现队列
题目描述 用两个栈来实现一个队列 完成队列的Push和Pop操作 队列中的元素为int类型 理解 关于栈 什么是栈 栈的抽象数据类型 Python实现栈 关于队列 什么是队列 队列抽象数据类型 Pyt ...
- 化栈为队(两个栈来实现一个队列)
实现一个MyQueue类,该类用两个栈来实现一个队列. 示例: MyQueue queue = new MyQueue();queue.push(1); queue.push(2); queue.pe ...
- 栈与队列2——两个栈组成队列
题目 编写一个类,用两个栈实现一个队列,并实现队列的基本操作(add,poll,peek) 思路 一个栈stackPush作为正常压入的栈,一个栈stackPop作为弹出的栈,将stackPush中的 ...
- c语言Inqueue函数用法,C语言用两个栈实现队列(完整版)
队列是一种 先进先出(first in - first out, FIFO)的数据结构,队列中的元素都从后端(rear)入队(push),从前端(front)出队(pop). 实现队列最直观的方法是用 ...
- [剑指offer] 用两个栈实现队列
本文首发于我的个人博客:尾尾部落 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 解题思路 两个栈 stack1 和 stack2: push 动作都在 ...
- 多态指针访问虚函数不能被继承的类快速排序N皇后问题插入排序堆排序merge归并排序栈上生成对象两个栈实现一个队列...
多态 /*1. 要想实现覆盖(重写)父类必须声明为virtual,子类可以不声明为virtual.-->FunB()2. 派生类重写基类的虚函数实现多态,要求函数名.参数列表.返回值完全相同.( ...
- 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java
<LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...
最新文章
- 基于新型忆阻器的存内计算原理、研究和挑战
- Android应用在不同版本间兼容性处理
- Python数据结构与算法(第六天)
- 国际电信联盟(ITU)发布最新IDI指数
- 图像多分类——卷积神经网络
- 给老板做PPT必备:文字加拼音
- Android studio设置相机权限,如何强制将“android.permission.CAMERA”权限添加到Codename中的清单中...
- 安卓 spinner下拉框 做模糊查询_SEO数据查询工具
- JenkinsDay18-查看服务器有哪些JOB
- C. Oh Those Palindromes
- 图像预处理第1步:将256色图像转化为灰度图像
- JavaScript的RegExp实例方法exec()
- 伦敦时间现在几点_伦敦现在几点
- 基于Python的豆果网食谱数据爬取及可视化分析系统
- Kotlin自定义android 控件
- 词向量与词意-Glo Ve
- 全新圣诞节头像框制作生成微信小程序源码下载支持多模板
- App打开小程序,小程序打开App
- mysql查询男生基本情况_MYSQL查询操作 详细
- 分享微信答题抽奖小程序制作步骤_可以做答题后抽奖活动吗