1 条题解
-
0
C :
#include<string.h> void Output( char [] ) ; int Solve( char [] , int ) ; int pd( char [] , int , int ); int main(void) { char zf[256]; gets( zf ); Solve( zf , 0 ); Output( zf ) ; return 0 ; } int pd( char zf[] , int left, int right ) { int i , leftAcount ; if( zf[ left - 1 ] == '-') { i = left; leftAcount = 1; while( ++ i < right) { if(zf[i] == '(') { leftAcount ++; } if(zf[i] == '+' && leftAcount == 1) { return 0; } } } if( zf[ left - 1 ] == '/') { return 0; } if(zf[ left - 1 ] != '*' && zf[ left - 1 ] != '/' && zf[ right + 1 ] != '*' && zf[ right + 1 ] != '/') { return 1; } i = left ; leftAcount = 1; while(++i < right) { if(zf[i] == '(') { leftAcount ++; } if(zf[i] == '*' && leftAcount == 1) { return 1; } } return 0; } int Solve( char zf[] , int i ) { int left , right ; while( zf[i] != '\0') { if( zf[i] == ')') { return i ; } if( zf[i] == '(') { left = i ; right = Solve( zf , i + 1 ) ; i = right ; if( pd( zf , left , right )) { zf[left] = ' ' ; zf[right] = ' ' ; } } i ++ ; } } void Output( char zf[] ) { int i = 0 ; while( zf[ i ] != '\0') { if(zf[i] != ' ') { putchar(zf[i]); } i ++ ; } }
C++ :
#include "iostream" #include "string" #include "stdio.h" #include "ctype.h" #include "algorithm" #include "stack" using namespace std; int cacluExprePriority(string str,bool &hasC) { int left=0; int right=0; bool bfind=false; for(int i=0;i<str.size();i++) { if(str[i]=='(') left++; if(str[i]==')') right++; if(str[i]=='/') hasC=true; if(str[i]=='*'||str[i]=='/') { if(left==right) return 2; } if(str[i]=='+'||str[i]=='-') { bfind=true; } } return bfind?1:-1; } bool vis[1000]; int safe(int i,int n) { if(i<0) return 0; if(i>=n) return n-1; return i; } void findIndexOfBrackets(string str) { stack<int>q; for(int i=0;i<str.size();i++) { if(str[i]=='(') { q.push(i); } if(str[i]==')') { int s=q.top(); int t=i; bool hasC=false; int priority=cacluExprePriority(str.substr(s+1,t-s-1),hasC); q.pop(); bool temp=false; if(s-1>=0&&cacluExprePriority(str.substr(safe(s-1,str.size()),1),temp)>=cacluExprePriority(str.substr(safe(t+1,str.size()),1),temp)) { char op=str[s-1]; { if(op=='+') { vis[s]=vis[t]=true; } if(op=='-') { if(priority==2) vis[s]=vis[t]=true; } if(op=='*') { if(priority==2&&hasC==false) vis[s]=vis[t]=true; } } } else if(t+1<str.size()) { char op=str[t+1]; if(op=='+'||op=='-') { vis[s]=vis[t]=true; } if(op=='*'||op=='/') { if(priority==2) vis[s]=vis[t]=true; } } } } } int main() { string exper; cin>>exper; findIndexOfBrackets(exper); for(int i=0;i<exper.size();i++) if(vis[i]==false) cout<<exper[i]; cout<<endl; return 0; }
Java :
import java.util.Arrays; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sca=new Scanner(System.in); String s=sca.next(); String str=""; int[] a=new int[s.length()]; for(int i=0;i<s.length();i++) { char c=s.charAt(i); if(a[i]==1) { continue; } if(c=='(') { boolean bo=true; if(i-1>=0) { if(s.charAt(i-1)=='*' || s.charAt(i-1)=='/' ) { //判断左括号前是否有乘除 bo=false; } } if(!bo) { continue; } int index=i+1; int zuo=0; boolean jian=true; if(i-1>=0) { if(s.charAt(i-1)=='-') { jian=false; } } while(true) { //找到匹配的右括号 if(!jian && s.charAt(index)=='+') { //判断左括号是-时,括号里有没有+ bo=false; break; } if(s.charAt(index)==')' && zuo==0) { break; } if(s.charAt(index)=='(') { zuo++; } if(s.charAt(index)==')') { zuo--; } index++; } if(!bo) { continue; } boolean bo2=true; if(index+1<s.length()) { if(s.charAt(index+1)=='*' || s.charAt(index+1)=='/') { //判断右括号右边是否有乘除 bo2=false; } } if(bo2) { //记录可以删除的括号位置 a[i]=1; a[index]=1; } } } for(int i=0;i<s.length();i++) { if(a[i]==0) { str+=s.charAt(i); } } System.out.println(str); } }
- 1
信息
- ID
- 2725
- 时间
- 1000ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者