逆波兰计算器&&中缀表达式转换为后缀表达式

简介: 技巧

逆波兰计算器


#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define IOS ios::sync_with_stdio(false)
#define endl '\n'
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
stack<double>stk;
int main() {
  IOS;
  double a, b;
  char c, str[10];
  int i = 0;
  scanf("%c", &c);
  while (c != '#') {
    while (isdigit(c) || c == '.') {
      str[i++] = c;
      str[i] = '\0';
      scanf("%c", &c);
      if (c == ' ') {
        a = atof(str);
        stk.push(a);
        i = 0;
        break;
      }
    }
    switch (c) {
    case '+': {
      a = stk.top();
      stk.pop();
      b = stk.top();
      stk.pop();
      stk.push(a + b);
      break;
    }
    case'-': {
      a = stk.top();
      stk.pop();
      b = stk.top();
      stk.pop();
      stk.push(b - a);
      break;
    }
    case'*': {
      a = stk.top();
      stk.pop();
      b = stk.top();
      stk.pop();
      stk.push(a * b);
      break;
    }
    case'/': {
      a = stk.top();
      stk.pop();
      b = stk.top();
      stk.pop();
      if (a == 0) {
        printf("Error!除数不能为0");
        return -1;
      }
      stk.push(b / a);
      break;
    }
    }
    scanf("%c", &c);
  }
  printf("%llf", stk.top());
  return 0;
}

输入

1 2 3 - 4 * + 10 5 / + # (以#为结束符)

输出

-1.000000


中缀表达式—>后缀表达式


#include<bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
#define mod 1000000007
#define IOS ios::sync_with_stdio(false)
#define endl '\n'
using namespace std;
typedef long long ll;
const int maxn = 1e5 + 10;
stack<char>s;
string ss;
int getnum(int& i,bool negtive) {
  int ans = 0;
  while (ss[i]>='0' && ss[i]<='9') {
    ans = ans * 10 + ss[i] - '0';
    ++i;
  }
  if (negtive)ans = -ans;
  return ans;
}
int main() {
  char c;
  char temp;
  getline(cin, ss);
  int i;
  for (i = 0;i < ss.size();++i) {
    while (isdigit(ss[i])) {
      printf("%c", ss[i]);
      ++i;
      if (ss[i]<'0' || ss[i]>'9') {
        printf(" ");
        break;
      }
    }
    if (ss[i] == ')') {
      do {
        temp = s.top();
        s.pop();
        if (temp != '(')printf("%c ", temp);
      } while (temp != '(');
    }
    else if (ss[i] == '+' || ss[i] == '-') {
      if (s.empty())s.push(ss[i]);
      else {
        do {
          temp = s.top();
          s.pop();
          if (temp == '(')s.push(temp);
          else {
            printf("%c ", temp);
          }
        } while (!s.empty() && temp != '(');
        s.push(ss[i]);
      }
    }
    else if (ss[i] == '*' || ss[i] == '/' || ss[i] == '(')s.push(ss[i]);
  }
  while (!s.empty()) {
    temp = s.top();
    s.pop();
    printf("%c ", temp);
  }
  return 0;
}

输入

1+(2-3)*4+10/5

输出

1 2 3 - 4 * + 10 5 / +

目录
相关文章
|
8月前
|
存储 算法 C语言
C语言编程—中缀表达式转换为后缀表达式
1.创建栈 2.从左向右顺序获取中缀表达式 a.数字直接输出 b.运算符 情况一:遇到左括号直接入栈,遇到右括号将栈中左括号之后入栈的运算符全部弹栈输出,同时左括号出栈但是不输出。 情况二:遇到乘号和除号直接入栈,直到遇到优先级比它更低的运算符,依次弹栈。 情况三:遇到加号和减号,如果此时栈空,则直接入栈,否则,将栈中优先级高的运算符依次弹栈(注意:加号和减号属于同一个优先级,所以也依次弹栈)直到栈空或则遇到左括号为止,停止弹栈。(因为左括号要匹配右括号时才弹出)。 情况四:获取完后,将栈中剩余的运算符号依次弹栈输出 例:将:2*(9+6/3-5)+4转化为后缀表达式 2 9
|
3月前
|
算法
数据结构与算法二:栈、前缀、中缀、后缀表达式、中缀表达式转换为后缀表达式
这篇文章讲解了栈的基本概念及其应用,并详细介绍了中缀表达式转换为后缀表达式的算法和实现步骤。
86 3
|
3月前
|
存储 C语言
中缀表达式转后缀表达式
本文提供了一个C语言程序,用于将中缀表达式转换为后缀表达式,并计算后缀表达式的结果,包括处理运算符优先级、括号匹配以及基本的四则运算。
59 0
|
8月前
|
索引
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
【力扣刷题】数组实现栈、后缀表达式(逆波兰表达式)求值、中缀表达式转换为后缀表达式(无括号&&有括号)
70 0
中缀表达式转后缀表达式(逆波兰式)
中缀表达式转后缀表达式(逆波兰式)
190 0
|
8月前
|
存储 算法
计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)
计算器——可支持小数的任意四则运算(中缀表达式转为后缀表达式算法)
77 1
|
8月前
|
算法 搜索推荐 程序员
第四十一练 中缀表达式转后缀表达式
第四十一练 中缀表达式转后缀表达式
60 0
|
算法
中缀表达式转后缀表达式(1、2、3) 2021-03-26
中缀表达式转后缀表达式(1、2、3) 2021-03-26
161 0
中缀表达式转后缀表达式(1、2、3) 2021-03-26
|
存储
中缀表达式转化为后缀表达式
中缀表达式转化为后缀表达式
126 0