队友的nb代码,学习一下。

#include <bits/stdc++.h>
using namespace std;
const int MAXS = 100;
using sss = stringstream;
char buf[MAXS];

int parseOr(sss& ss);

int parseInt(sss& ss) {
  int ret;
  ss >> ret;
  return ret;
}
int parseBracket(sss& ss) {
  if (ss.peek() == '(') {
    ss.get();
    int x = parseOr(ss);
    ss.get();
    return x;
  }
  return parseInt(ss);
}

int parseSign(sss& ss) {
  char op = ss.peek();
  if (op == '+') {
    ss.get();
    return parseSign(ss);
  }
  if (op == '-') {
    ss.get();
    return -parseSign(ss);
  }
  if (op == '~') {
    ss.get();
    return ~parseSign(ss);
  }
  return parseBracket(ss);
}
int parseMul(sss& ss) {
  int ret = parseSign(ss);
  if (ss.peek() == '*') ss.get(), ret = ret * parseMul(ss);
  return ret;
}
int parseAdd(sss& ss) {
  int ret = parseMul(ss);
  while (true) {
    char op = ss.peek();
    if (op != '+' && op != '-') break;
    ss.get();
    int x = parseMul(ss);
    if (op == '+')
      ret += x;
    else
      ret -= x;
  }
  return ret;
}
int parseAnd(sss& ss) {
  int ret = parseAdd(ss);
  if (ss.peek() == '&') ss.get(), ret &= parseAnd(ss);
  return ret;
}
int parseXor(sss& ss) {
  int ret = parseAnd(ss);
  if (ss.peek() == '^') ss.get(), ret ^= parseXor(ss);
  return ret;
}

int parseOr(sss& ss) {
  int ret = parseXor(ss);
  if (ss.peek() == '|') ss.get(), ret |= parseOr(ss);
  return ret;
}
int main() {
  string s;
  cin >> s;
  sss ss(s);
  printf("%d\n", parseOr(ss));
}
最后修改:2020 年 07 月 30 日 10 : 18 PM