关闭

栈计算器 Calculator1.0

标签: 栈 c++ 数据结构 计算器
305人阅读 评论(0) 收藏 举报

花了大概三天的零碎时间学习了用栈实现计算器(可用于小数点以及多位数的计算)。下面转来了一篇前人的代码,而且把自己的理解作为注释写入。

.  就目前所学,还写不出其他什么值得记录的东西。先这样O(∩_∩)O

#include <iostream>  
#include <string>  
#include <stack>  
#include<cctype> 
using namespace std;
bool IsOne(char c){
	return (c == '+' || c == '-');
}
bool IsTwo(char c){
	return (c == '*' || c == '/');
}
string Infix_Postfix(string Infix){//中缀改后缀
	stack<char> stack;
	string result;
	for (int i = 0; i<Infix.size(); i++){
		if (isdigit(Infix[i]) || Infix[i] == '.')//函数isdigit(), 参数是数字,返回真
		{    
			while (isdigit(Infix[i]) || Infix[i] == '.') 
			{result += Infix[i++]; }
			i--;//while循环最后多加了一次,减回去.*
			result += ' '; //不同数字之间用空格隔开
			 
		}
		else if (IsOne(Infix[i])){ //读到一级运算符
			while (stack.size() && (IsOne(stack.top()) || IsTwo(stack.top()))){ //A&&(B||C)形式
				result += stack.top();
				stack.pop();
			}
			stack.push(Infix[i]);
		}

		else if (Infix[i] == ')'){  //括号优先
			while (stack.top() != '('){
				result += stack.top();
				stack.pop();
			}
			stack.pop();//最后记得弹出"("
		}
		else if (IsTwo(Infix[i])){  //读到二级运算符
			while (stack.size() && IsTwo(stack.top())){
				result += stack.top();
				stack.pop();
			}
			stack.push(Infix[i]);//压入二级运算符
		}
		else stack.push(Infix[i]);
	}
	while (stack.size()){ 
		result += stack.top();
		stack.pop();
	}
	return result;
}

double TenTimes(int n){
	double res = 1;
	for (int i = 0; i<n; i++){
		res *= 10;
	}
	return res;
}

double Achieve(string s){ // 实现了大于9以及小数的计算
	double res = 0;
	char c;
	int dec = 0;
	for (int i = 0; i < s.size(); i++){
		c = s[i ];
		if (c == '.')  dec = i; //标记小数点在第几位
		else if (!dec) res = res * 10 + c - '0';//只要往后一位,前面的计算结果*10
		else res += (c - '0') / TenTimes(i-dec);//计算小数值
	}
	return res;
}

double Calculate(string s){
	double res, t;
	stack<double> num;
	string temp;
	for (int i = 0; i<s.size(); i++){
		temp = "";
		if (isdigit(s[i]) || s[i] == '.'){
			while (isdigit(s[i]) || s[i] == '.') temp += s[i++]; //如果最后一位是数字,这样做会出错   
			num.push(Achieve(temp));
		}
		else{
			switch (s[i]){
			case '+': t = num.top(); num.pop(); t += num.top(); num.pop(); num.push(t); break;
			case '-': t = num.top(); num.pop(); t = num.top() - t; num.pop(); num.push(t); break;
			case '*': t = num.top(); num.pop(); t *= num.top(); num.pop(); num.push(t); break;
			case '/': t = num.top(); num.pop(); t = num.top() / t; num.pop(); num.push(t); break;
			default: cerr << "Fatal Error! Result would be wrong!" << endl; system("pause"); break;
			}
		}
	}
	res = num.top();
	return res;
}


int main(){
	string mid, result;

	cin >> mid;
	result = Infix_Postfix(mid);
	cout << "Infix change to Postfix: " << endl;
	cout << result << endl;
	cout << "The result is: " << Calculate(result) << endl;
	system("pause");
	return 0;
}


1
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

栈实现计算器

栈实现计算器 黑色印记 前段时间利用栈写了一个实现了计算器功能的程序。觉得有意思的,因此今天在这了和大家分享一番。 首先,要写出计算器,你要按照以下几点去写,才能保证运算的优先级不发生错误。 ...
  • xieyihua1994
  • xieyihua1994
  • 2016-06-12 11:06
  • 5930

【C++】C++顺序栈实现的计算器

实现原理 该计算器数据存储是通过声明一个栈模板,来创建一个int类型和char类型的栈。int栈存储表达式中的数字,char类型的栈存储表达式中的运算符。   在输入表达式时,通过在表达式首尾添...
  • White_Idiot
  • White_Idiot
  • 2016-09-08 14:05
  • 7062

利用栈Stack实现计算器实验设计(C++)

一、实验思路1.输入中缀式。 输入格式:string,包括数字、运算符号(包括括号和英文运算函数名如sin等)。2.将中缀式转换为后缀式。 输入:中缀式 格式:string 方法:栈后进先出原理...
  • Irene_Loong
  • Irene_Loong
  • 2017-02-25 19:02
  • 1003

巧妙利用栈实现计算器

首先我们实现一个计算器,用户所输入的为中缀表达式,这是通用的算术公式的表达方法,但是有一个缺点就是不容易被计算机所理解。所以,有了所谓的后缀表达式! 后缀表达式:不包含括号,运算符放在两个运算对象的...
  • qq_26768741
  • qq_26768741
  • 2016-06-04 18:41
  • 5588

c++ 数据结构 *** 栈的应用——计算器

新年第一次发,这几天在复习期末考试。。但是好像已经复习完了但是还有十天多才考试感觉挺无聊的就写个计算器。。但是代码太难看。。代码里一堆的if else。。我还是学好catch throw吧!!!!先贴...
  • treeshy
  • treeshy
  • 2016-01-08 11:04
  • 1173

简单计算器(栈)

转于:http://blog.csdn.net/zhengxu001/article/details/8022085 转自 Bupt Acmer 任意表达式(expression)都是...
  • jinjide_ajin
  • jinjide_ajin
  • 2015-07-28 17:45
  • 645

用栈实现简单的计算器

我们知道在计算的时候,运算符的优先级是很关键的,如乘除法的优先级要高于加减法,而括号里面的优先级要高于括号外面的优先级。为了表示运算符的优先级,我们先定一个哈希表来表示运算符和其优先级 # value...
  • u014663439
  • u014663439
  • 2017-02-15 16:32
  • 778

Java实现栈之计算器

Java实现栈来做一个将中缀表达式转化为后缀表达式的程序,中缀表达式更符合我们的主观感受,后缀表达式更适合计算机的运算,下面直接上代码吧:package Character1;import java....
  • Marksinoberg
  • Marksinoberg
  • 2015-10-23 23:32
  • 7456

栈的应用——实现简易计算器(一)

周日晚上心血来潮,想用栈做个简单的计算器,于是便动手鼓捣了。参照书上的思想,我用了两个栈来解决这个问题。 1)栈S1用来存放运算符,栈S2用来存放操作数。由于运算符为char型而操作数为int型...
  • larry233
  • larry233
  • 2016-03-29 13:05
  • 617

栈溢出攻击之弹出计算器

一.系统栈溢出原理函数栈帧及寄存器在高级语言中,当函数被调用时,系统栈会为这个函数开辟一个新的栈帧,并把它压入栈中。这个栈帧中的内存空间被它所属的函数独占,正常情况下是不会和别的函数共享的。当函数返回...
  • rectsuly
  • rectsuly
  • 2017-04-15 01:20
  • 1223
    个人资料
    • 访问:17774次
    • 积分:716
    • 等级:
    • 排名:千里之外
    • 原创:52篇
    • 转载:4篇
    • 译文:2篇
    • 评论:1条
    最新评论