• 计算器的制作(不支持负数和小数)


    1. 这个利用堆栈做成的简易计算器,但是只能支持不带小数的计算,刚刚想了一会没钻研出来小数的计算,等我钻研出来了继续更新。
    2. 需要提前掌握堆栈 中缀表达式转后缀表达式的知识点。
    3. 水平有限,请多多指教相互学习嘻嘻。
    #include<iostream>
    #include<string>
    #include<stack>
    using namespace std;
    double number(string& s, int&i){                         //将字符转化为数字;
    	int m = 0;
    	int  j;
    	int k = 0;
    	int a[10] = { 0 };
    	for (j = i; s[j] < '10' && s[j]>'0'; j++) {
    		a[m] = s[j] - '0';
    		m++;
    	}
    	i = j - 1;                                           //这一步如果是连串的数字,i的检索直接跳过了输出一窜数字,不然会拆开造成重复输出;
    	for (j = 0; j < m; j++) 
    		k += a[j] * pow(10, m - j-1);
    	return k;
    }
    
    int Rank(char ch) {                                             //给符号定义优先级,便于比较
    	if (ch == '+' || ch == '-')
    		return 1;
    	if (ch == '*' || ch == '/')
    		return 2;
    	if (ch == '(')
    		return 0;
    }
    
    string transform(string& s) {                         //将中缀表达式变成后缀表达式,用数组或者字符串接收
    	int i = 0; int j = 0;
    	stack<char>c;
    	char ch[100];
    	for (i = 0; i < s.size(); i++) {
    		if (s[i] == ' ')
    			continue;
    		if (s[i] < '10' && s[i]>'0') {                //这一步卡了很久,数字的话一波连续输出
    			while (s[i] < '10' && s[i]>'0') {
    				ch[j] = s[i];
    				i++;
    				j++;
    			}
    			ch[j] = ' ';              //分割数字之间
    			j++;
    			i--;
    		}
    		else {
    			if (c.empty())
    				c.push(s[i]);
    			else if (s[i] == ')') {
    				while (c.top() != '(') {
    					ch[j] = c.top();
    					j++;
    					c.pop();
    				}
    				c.pop();
    			}
    			else if (s[i] == '(') {
    				c.push(s[i]);
    			}
    			else if (Rank(s[i]) > Rank(c.top())) {
    				c.push(s[i]);
    			}
    			else
    			{
    				while (!c.empty() && (Rank(s[i]) <= Rank(c.top()))) {
    					ch[j] = c.top();
    					j++;
    					c.pop();
    				}
    				c.push(s[i]);
    			}
    		}
    	}
    	while (!c.empty()) {
    		ch[j] = c.top();
    		j++;
    		c.pop();
    	}		
    	string s1(ch, 0, j);
    	return s1;
    }
    
    double caculate(string& s) {                //利用后缀表达式进行计算
    	int i, k;
    	double a, b;
    	stack<double>v;
    	for (int i = 0; i < s.size(); i++) {
    		if (s[i] == ' ')
    			continue;
    		else if (s[i] < '10' && s[i]>'0')
    			v.push(number(s, i));
    		else {
    			a = v.top(), v.pop();
    			b = v.top(), v.pop();
    			switch (s[i]) {
    			case'+':v.push(a + b); break;
    			case'-':v.push(b-a); break;
    			case'*':v.push(a * b); break;
    			case'/':v.push(b/a); break;
    			}
    		}
    	}
    	return v.top();
    }
    
    int main()
    {
    	string s1, s2;
    	getline(cin, s1);
    	s2 = transform(s1);                             //先转成后缀表达式再进行计算
    	double result = caculate(s2);
    	cout << result << endl;
    	return 0;
    }
    
  • 相关阅读:
    [数据结构]图的DFS和BFS的两种实现方式
    [算法]两个栈实现一个队列
    [数据结构]手动实现队列
    [数据结构]手动实现栈
    [数据结构]手动实现单链表
    Hive分组取Top K数据
    HBase解决海量图片存储方案
    非结构化数据存储方案
    头条面试题之实现两个线程轮流打印字符串
    [算法]最大连续子数组和,最长重复子串,最长无重复字符子串
  • 原文地址:https://www.cnblogs.com/Hsiung123/p/13110007.html
Copyright © 2020-2023  润新知