本文实例为大家分享了C++实现简易计算器功能的具体代码,供大家参考,具体内容如下
介绍
介绍:仅支持自然数间的+ - * /操作,并没有括号。
实现:利用栈实现存储运算数以及运算符。
流程
1、输入:string exp
2、对EXP进行处理:数字入数栈,运算符入字符栈。
1)栈空,字符入栈
2)栈非空
栈顶运算级别> =当前字符运算级,取栈顶运算符并出栈两个数,计算,结果入数栈
3)字符入栈
3、对字符栈检测,非空时进行计算
4、输出:结果。
实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
const int MAXSIZE = 100; //栈的最大大小 template < typename T> class Stack { private : T data[MAXSIZE]; int top; public : Stack(); void Push( const T& val); T Top() const ; void Pop(); void Clear(); bool IsFull() const ; bool IsEmpty() const ; }; template < typename T> Stack<T>::Stack() { top = -1; } template < typename T> void Stack<T>::Push( const T& val) { if (IsFull()) exit (1); //未满 data[++top] = val; } template < typename T> T Stack<T>::Top() const { if (IsEmpty()) exit (1); //非空 return data[top]; } template < typename T> void Stack<T>::Pop() { if (IsEmpty()) exit (1); --top; } template < typename T> void Stack<T>::Clear() { top = -1; } template < typename T> bool Stack<T>::IsFull() const { return top == MAXSIZE - 1; } template < typename T> bool Stack<T>::IsEmpty() const { return top == -1; } class Calculator { private : Stack< int > num; Stack< char > ch; //运算符 bool GetTwoOperands( int & left, int & right); void Compute(); void Deal( const string& exp ); public : Calculator() {} void Run(); void Clear(); //清空数栈以及字符栈 }; void Calculator::Run() { string exp ; cin >> exp ; Deal( exp ); while ( !ch.IsEmpty()) { Compute(); } cout << "结果:" << num.Top() << endl; Clear(); } void Calculator::Deal( const string& exp ) { int i(0), n( exp .length()); bool last = false ; while (i < n&& exp [i] != '=' ) { if ( exp [i] >= '0' && exp [i] <= '9' ) { if (last) { int x = num.Top() * 10 + ( exp [i] - '0' ); num.Pop(); num.Push(x); } else { num.Push( exp [i] - '0' ); last = true ; } } else { last = false ; while (!ch.IsEmpty()) { int i1 = f(ch.Top()); int i2 = f( exp [i]); if (i1 >= i2) Compute(); else break ; } ch.Push( exp [i]); } ++i; } } |
计算:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
void Calculator::Compute() { bool b; int left, right; b = GetTwoOperands(left, right); if (!b) { cout << "Error\n" ; Clear(); } else { char op = ch.Top(); ch.Pop(); switch (op) { case '+' : left += right; break ; case '-' : left -= right; break ; case '*' : left *= right; break ; case '/' : if (right == 0) { cout << "Error\n" ; Clear(); return ; } left /= right; break ; } num.Push(left); } } // 将运算符优先级转为整数,便于比较 int f( const char & c) { if (c == '+' || c == '-' ) return 1; else return 2; } |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/qq_31854267/article/details/109086232