Skip to content

Instantly share code, notes, and snippets.

@chermehdi
Created September 18, 2016 21:15
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save chermehdi/b18a980d43908964249eb5b0e74dd3cd to your computer and use it in GitHub Desktop.
Save chermehdi/b18a980d43908964249eb5b0e74dd3cd to your computer and use it in GitHub Desktop.
Spoj Transform The Expression Problem
package com.algorithms;
/**
* @Author Mehdi Maick
* Created on 18/09/2016.
*/
import java.util.*;
import java.io.*;
public class TransforTheExpression {
public static int preced(char a) {
if (a == '+') return 0;
if (a == '-') return 1;
if (a == '*') return 2;
if (a == '/') return 3;
if (a == '^') return 4;
return 10;
}
public static boolean isOp(char a) {
return (a == '+' || a == '-' || a == '/' || a == '*' || a == '^');
}
public static void solve(FastReader fs, PrintWriter pw) {
int t = fs.nextInt();
char[] exp;
while (t-- > 0) {
exp = fs.nextLine().trim().toCharArray();
pw.println(evaluate(exp));
}
}
private static String evaluate(char[] s) {
StringBuilder sb = new StringBuilder();
Stack<Character> st = new Stack<>();
for (int i = 0; i < s.length; i++) {
if (s[i] == '(') {
st.add(s[i]);
} else if (s[i] == ')') {
while (st.peek() != '(')
sb.append(st.pop());
st.pop();
} else if (isOp(s[i])) {
if (st.empty()) {
st.push(s[i]);
} else {
if (preced(st.peek()) > preced(s[i])) {
while (preced(st.peek()) > preced(s[i]) && st.peek() != '(')
sb.append(st.pop());
st.add(s[i]);
} else {
st.push(s[i]);
}
}
} else {
sb.append(s[i]);
}
}
while (!st.empty())
sb.append(st.pop());
return sb.toString();
}
public static void main(String[] args) throws Exception {
FastReader fs = new FastReader(System.in);
PrintWriter pw = new PrintWriter(new OutputStreamWriter(System.out));
solve(fs, pw);
fs.close();
pw.close();
}
static class FastReader {
BufferedReader reader;
StringTokenizer st;
FastReader(InputStream stream) {
reader = new BufferedReader(new InputStreamReader(stream));
st = null;
}
String next() {
while (st == null || !st.hasMoreTokens()) {
try {
String line = reader.readLine();
if (line == null) {
return null;
}
st = new StringTokenizer(line);
} catch (Exception e) {
throw new RuntimeException();
}
}
return st.nextToken();
}
String nextLine() {
String s = null;
try {
s = reader.readLine();
} catch (IOException e) {
e.printStackTrace();
}
return s;
}
int nextInt() {
return Integer.parseInt(next());
}
long nextLong() {
return Long.parseLong(next());
}
double nextDouble() {
return Double.parseDouble(next());
}
char nextChar() {
return next().charAt(0);
}
int[] nextIntArray(int n) {
int[] arr = new int[n];
int i = 0;
while (i < n) {
arr[i++] = nextInt();
}
return arr;
}
long[] nextLongArray(int n) {
long[] arr = new long[n];
int i = 0;
while (i < n) {
arr[i++] = nextLong();
}
return arr;
}
int[] nextIntArrayOneBased(int n) {
int[] arr = new int[n + 1];
int i = 1;
while (i <= n) {
arr[i++] = nextInt();
}
return arr;
}
long[] nextLongArrayOneBased(int n) {
long[] arr = new long[n + 1];
int i = 1;
while (i <= n) {
arr[i++] = nextLong();
}
return arr;
}
void close() {
try {
reader.close();
} catch (IOException e) {
System.err.println("There's been an error trying closing the reader ");
e.printStackTrace();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment