zoukankan      html  css  js  c++  java
  • 简单计算器-栈stack和队列queue

    一、技术总结

    1. 主要是一个中缀表达式,然后求值,一些加减乘除
    2. 第一步是把中缀表达式转化为后缀表达式
    3. 然后就是计算后缀表达式,计算出结果
    4. 主要是两个函数,一个是转化函数Change()还有一个是计算函数Cal()

    二、参考代码:

    #include<iostream>
    #include<cstdio>
    #include<string>
    #include<stack>
    #include<queue>
    #include<map>
    using namespace std;
    
    struct node{
    	double num;//操作数 
    	char op;//操作符 
    	bool flag;//true表示操作数,false表示操作符 
    }; 
    
    string str;
    stack<node> s;//操作符栈 
    queue<node> q;//后缀表达式序列 
    map<char, int> op;
    
    void Change(){
    	double num;
    	node temp;
    	for(int i = 0; i < str.length(); ){
    		if(str[i] >= '0' && str[i] <= '9'){//如果是数字 
    			temp.flag = true;//标记是数字
    			temp.num = str[i++] - '0';//记录这个操作数的第一个数位
    			while(i < str.length() && str[i] >= '0' && str[i] <= '9'){
    				temp.num = temp.num * 10 + (str[i] - '0');//更新这个操作数
    				i++; 
    			}  
    			q.push(temp);//将操作数压入后缀表达式的队列 
    		}else{//如果是操作符 
    			temp.flag = false;//标记是操作符
    			//只要操作符栈的栈顶元素比该操作符优先级高
    			//就把操作符栈栈顶元素弹出到后缀表达式队列中
    			while(!s.empty() && op[str[i]] <= op[s.top().op]){
    				q.push(s.top());
    				s.pop();
    			} 
    			temp.op = str[i];
    			s.push(temp);//把该操作符压入操作符栈中
    			i++; 
    		} 
    	}
    	while(!s.empty()){
    		q.push(s.top());
    		s.pop();
    	}
    } 
    
    double Cal(){//计算后缀表达式
    	double temp1, temp2;
    	node cur, temp;
    	while(!q.empty()) {//只要后缀表达式队列非空 
    		cur = q.front();//cur记录队首元素 
    		q.pop();
    		if(cur.flag == true) s.push(cur);//如果是操作数直接压入栈
    		else{//如果是操作符
    			temp2 = s.top().num; //弹出第二操作数
    			s.pop();
    			temp1 = s.top().num;//弹出第一操作数
    			s.pop(); 
    			temp.flag = true;//临时记录操作数
    			if(cur.op == '+') temp.num = temp1 + temp2;
    			else if(cur.op == '-') temp.num = temp1 - temp2;
    			else if(cur.op == '*') temp.num = temp1 * temp2;
    			else temp.num = temp1 / temp2;
    			s.push(temp);//把操作数压入栈 
    		} 
    	}
    	return s.top().num;//栈顶元素就是最后表达式的值 
    }
    
    int main(){
    	op['+'] = op['-'] = 1;
    	op['*'] = op['/'] = 2;
    	while(getline(cin, str), str != "0"){
    		for(auto it = str.end(); it != str.begin(); it--){
    			if(*it == ' ') str.erase(it);//把表达式中的所有空格全部去掉 
    		}
    		while(!s.empty()) s.pop();//初始化栈
    		Change();
    		printf("%.2f
    ", Cal()); 
    	}
    	return 0;
    } 
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    数据库表与视图的区别
    maven中snapshot版本和正式版本的区别
    @Retention注解
    java泛型以及通配符
    git 删除了本不应该删除的commit 如何恢复
    ES group分组聚合的坑
    solution for 1006 中国剩余定理
    solution for POJ 1001
    ondraw() 和dispatchdraw()的区别
    android几种定时器机制及区别(转载整理)
  • 原文地址:https://www.cnblogs.com/tsruixi/p/12246875.html
Copyright © 2011-2022 走看看