|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 学习编程中的Ben 于 2024-8-1 21:54 编辑
看了某位仁兄的计算器得了精华,也发一个秀一秀.
主要原理是通过栈来转化成后缀表达式进行计算,中途用 . 来区分数字和数字.
虽然比起 @zhangchenyvn 的短一些,但为了区分优先级,用了很多很多很多判断......
支持 + - * / ^ 五种运算
当时学栈的副产品,写的不好不要吐槽哈
话不多说,秀代码 :
- #include <bits/stdc++.h>
- using namespace std;
- stack<long long> s;
- stack<char> sc;
- int sum, ss, a, b, j;
- char p[300], hz[300];
- int main() {
- cin >> p;
- for (int i = 0; i < strlen(p); i++){
- if (p[i] >= '0' && p[i] <= '9'){
- hz[j++] = p[i];
- if ((p[i + 1] < '0' || p[i + 1] > '9')) hz[j++] = '.';
- }else{
- if (sc.empty()) sc.push(p[i]);
- else if (p[i] == ')'){
- while (sc.top() != '('){
- hz[j++] = sc.top();
- sc.pop();
- }
- sc.pop();
- }else if (((p[i] == '*' || p[i] == '/') && (sc.top() != '*' && sc.top() != '/' && sc.top() != '^')) || p[i] == '(' || (p[i] == '^' && sc.top() != '^')) sc.push(p[i]);
- else{
- if (p[i] == '+' || p[i] == '-'){
- while (!sc.empty()){
- if (sc.top() == '(') break;
- hz[j++] = sc.top();
- sc.pop();
- }
- sc.push(p[i]);
- }else if(p[i] == '*' || p[i] == '/'){
- while (!sc.empty()){
- if (sc.top() == '(' || sc.top() == '+' || sc.top() == '-') break;
- hz[j++] = sc.top();
- sc.pop();
- }
- sc.push(p[i]);
- }else{
- hz[j++] = sc.top();
- sc.push(p[i]);
- sc.pop();
- }
- }
- }
- }
- while (!sc.empty()){
- hz[j++] = sc.top();
- sc.pop();
- }
- for (int i = 0; i < j; i++){
- if (hz[i] == '.'){
- sum = 0;
- for (int j = ss; j < i; j++) sum = sum * 10 + hz[j] - '0';
- ss = i + 1;
- s.push(sum);
- }else if (hz[i] < '0' || hz[i] > '9'){
- b = s.top();
- s.pop();
- a = s.top();
- s.pop();
- if (hz[i] == '+') s.push(a + b);
- if (hz[i] == '-') s.push(a - b);
- if (hz[i] == '*') s.push(a * b);
- if (hz[i] == '/') s.push(a / b);
- if (hz[i] == '^') s.push(pow(a, b));
- ss++;
- }
- }
- cout << s.top();
- return 0;
- }
复制代码
@liuhongrun2022 @陶远航 @歌者文明清理员 @zhangjinxuan @Twilight6
PS:太久没@了, 都不知道谁还在.... |
评分
-
查看全部评分
|