去除表达式里面多余的()

这是很久之前CSDN上一个朋友问我的一道题:

 

去除表达式里面多余的()
检查字符串表达式中的括号是否匹配;
左括号数目同有括号数目不相等即为不匹配;
去除多余的左括号或者右括号,优先保留先出现的括号;
匹配后去除无效的括号:如:((表达式)) 应为(表达式);
只考虑小括号,不考虑先出现右括号的情况;
要求实现函数: (字符串最长长度为60;表达式正确性不需要考虑)
void Bracket(char* src, char* dst);

如果匹配则通过dst输出原串;

如果不匹配则根据要求去处多于括号后通过dst输出匹配后的串

示例
输入:12+(345*25-34) 输出:12+(345*25-34)

输入:12+(345*(25-34) 输出: 12+(345*25-34)

输入:(12+345)*25)-34 输出: (12+345)*25-34

输入:(543+(256-43)*203))+24 输出:(543+(256-43)*203)+24

输入:((1+2)*((34-2))+((2*8-1) 输出:((1+2)*(34-2)+2*8-1)

 

#include <stdio.h> #include <iostream> #include <string.h> #include <stack> #define maxv(a, b) ((a) >= (b) ? (a) : (b)) #define minv(a, b) ((a) <= (b) ? (a) : (b)) #define MAX_N 60 using namespace std; bool unValid[MAX_N + 1]; char input[MAX_N + 1]; char output[MAX_N + 1]; int len; int lp[MAX_N + 1]; int rp[MAX_N + 1]; struct para { char type; int pos; para(char t, int p) { type = t; pos = p; } }; stack<para> pStack; void Bracket(char* src, char* dst) { int i; //去除多余的右括号 if(lp[0] < rp[0]) { for(i = rp[0]; i >= lp[0] + 1; i--) { unValid[rp[i]] = true; rp[i] = -1; } } //去除多余的左括号 else if(lp[0] > rp[0]) { for(i = lp[0]; i >= rp[0] + 1; i--) { unValid[lp[i]] = true; lp[i] = -1; } } //匹配后去除无效的括号:如:((表达式)) 应为(表达式) for(i = 0; i < len; i++) { if(input[i] == '(' && !unValid[i]) { while(pStack.size() >= 1 && pStack.top().type == ')') pStack.pop(); pStack.push(para('(', i)); } else if(input[i] == ')' && !unValid[i]) { if(pStack.size() >= 3) { para p1 = pStack.top(); if(p1.type == ')') { pStack.pop(); para p2 = pStack.top(); pStack.pop(); para p3 = pStack.top(); pStack.pop(); if(p1.type == ')' && p2.type == '(' && p3.type == '(' && p2.pos - p3.pos == 1 && i - p1.pos == 1) { unValid[p1.pos] = true; unValid[p2.pos] = true; } pStack.push(p3); } } pStack.push(para(')', i)); } } int k = 0; for(i = 0; i < len; i++) { if(!unValid[i]) { dst[k++] = input[i]; } } dst[k] = '/0'; } int main() { char ch; while((ch = getchar()) != 10) { input[len++] = ch; if(ch == '(') { lp[0]++; lp[lp[0]] = len - 1; } else if(ch == ')') { rp[0]++; rp[rp[0]] = len - 1; } } Bracket(input, output); printf("%s/n", output); return 0; }  

你可能感兴趣的:(去除表达式里面多余的())