算法学习之基础(背包 列队 栈) 习题1.3.9 补全括号

  题目描述:编写一段程序,从标准输入得到一个缺少左括号的表达式,并打印出补全括号之后的中序表达式。列如 1+2 ) * 3 - 4 ) * 5 - 6 ) ) )

你的程序应该输出 ( ( 1 +2 ) * ( ( 3 - 4 )* ( 5 - 6) ) )

  刚开始看到这个习题感觉这反扩号可以随便补没有限制啊,但按要求输出给的样例那种肯定是利用前面学过的知识,唯一有关系的就是求算术表达式的值了,

  求算术表达式步骤很简单,首先初始化两个栈,一个运算符,一个存操作数

  碰到数字压入操作数栈,

  碰到运算发压入运算符栈,

  碰到( 忽略,

  碰到 ) 弹出运算符,弹出运算符所需要的操作数(一般两个),将操作数和运算符计算出的结果压入操作数栈。

  根据上面方法,只需要把最后一步改下碰到)弹出运算符,弹出运算符所需操作数将 "("+"操作数"+"运算符"+"操作数"+")"这个字符串压入操作数栈里(可以把操作数栈用String),最后弹出操作数栈就ok。

  

 1 public static String bracket(String s){
 2         Stack<String> o=new Stack<String>();//运算符
 3         Stack<String> v=new Stack<String>();//操作数
 4         char[] c=s.toCharArray();
 5         for(int i=0;i<c.length;i++){
 6             s=c[i]+"";
 7             if("+".equals(s)||"-".equals(s)||"*".equals(s)||"/".equals(s)){
 8                 o.push(s);
 9             }else if(")".equals(s)){
10                 String a=v.pop();
11                 String b=v.pop();
12                 s="("+b+o.pop()+a+")";//这里注意a和b的顺序
13                 v.push(s);
14             }else if("(".equals(s)){
15                 //不管,主要是后面懒得写判断数字。。。
16             }else{
17                 v.push(s);
18             }
19         }
20         return v.pop();
21     }

测试

System.out.println(bracket("1+2)*3-4)*5-6)))"));

结果:

((1+2)*((3-4)*(5-6)))

 哦,这里的Stack用的是自己写的类

package gh;

import java.util.Iterator;

/**
 * 链表实现下压栈
 * @author ganhang
 * @param <T>
 */
public class Stack<T> implements Iterable<T>{
    private Node first;//栈里的元素
    private int n;//栈大小
    private class Node{
        T item;
        Node next;
    }
    public void push(T item){
        //向栈顶添加元素(节点)
        Node oldfirst =first;
        first=new Node();
        first.item=item;
        first.next=oldfirst;
        n++;
    }
    //返回最近添加的元素,不删除
    public T peek(){
        T item=first.item;
        return item;
    }
    //删除最近添加的元素
    public T pop(){
        //删除头节点
        T item=first.item;
        first=first.next;
        n--;
        return item;
    }
    public boolean isEmpty(){
        return n==0;
    }
    public int size(){
        return n;
    }
    @Override
    public Iterator<T> iterator() {
        // TODO Auto-generated method stub
        return new StackIterator();
    }
    private class StackIterator implements Iterator<T>{
        private Node current=first;
        @Override
        public boolean hasNext() {
            // TODO Auto-generated method stub
            return n!=0;
        }

        @Override
        public T next() {
            // TODO Auto-generated method stub
            T item=current.item;
            current=current.next;
            return item;
        }

        @Override
        public void remove() {
            // TODO Auto-generated method stub
            
        }
        
    }
}
原文地址:https://www.cnblogs.com/ganhang-acm/p/5357239.html