栈应用之中缀到后缀表达式的转换

栈操作是常数时间操作,后缀表达式花费的是O(N).

中缀转后缀表达式算法描述:

(1)遇到操作数,直接输出;

(2)栈为空时,遇到操作符,入栈;

(3)遇到左括号、入栈;

(4)遇到右括号,执行出栈操作,并输出出栈元素,直到遇到左括号,左括号不输出;

(5)遇到其他运算符'+''-''*''/'时,弹出所有优先级大于或等于该操作符的栈顶元素,然后将该操作符入栈;

(6最终将栈中的元素依次出栈,输出。

经过上面的步骤,得到的输出既是转换得到的后缀表达式。

举例:a+b*c+(d*e+f)*g ---------> abc*+de*f+g*+

public class InToPostfix {
	private Stack<Character> s;
	private String input;
	private String output="";

	public InToPostfix(String input) {
		this.input = input;
		s = new Stack<Character>();
	}

	public String doTrans(){
		for(int i=0; i<input.length(); i++){
			char c = input.charAt(i);
			switch(c){
			//2.栈为空时,遇到操作符,入栈
			//3.遇到其他运算符'+''-''*''/'时,弹出所有优先级大于或等于该操作符的栈顶元素,然后将该操作符入栈;
			case '+':
			case '-':
				gotOper(c,1);
				break;
			case '*':
			case '/':
				gotOper(c,2);
				break;	
			//4.遇到(,入栈
			case '(':
				s.push(c);
				break;
			//5.遇到),出栈,只接输出,直到遇到(,不输出
			case ')':
				gotParent();
				break;
			//1遇到操作数,直接输出
			default:
				output +=c;
				break;
			}
		}
		//6.最后将栈中的元素全部输出
		while(!s.isEmpty()){
			output += s.pop();
		}
		return output;
	}

	private void gotOper(char ch, int prior1){
		while(!s.isEmpty()){
			char top = (char) s.pop();
			if(top=='('){
				s.push(top);
				break;
			}else{
				int prior2;
				if(top=='+'||top=='-'){
					prior2 = 1;
				}else{
					prior2 = 2;
				}
				if(prior2 < prior1){
					s.push(top);
					break;
				}else{
					output += top;
				}
			}
		}
		s.push(ch);
	}
	
	private void gotParent(){
		while(!s.isEmpty()){
			char c = (char) s.pop();
			if(c != '('){
				output += c;
			}else{
				break;
			}
		}
	}
	public static void main(String[] args) {
		String input = "a+b*c+(d*e+f)*g";
		
		InToPostfix inTo = new InToPostfix(input);
		String output =inTo.doTrans();
		System.out.println(output);
	}
}


转载于:https://my.oschina.net/elain/blog/398917

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值