zoukankan      html  css  js  c++  java
  • 算法学习之基础(背包 列队 栈) 习题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
                
            }
            
        }
    }
  • 相关阅读:
    07.进程管理+作业控制+文件查找与压缩+文件压缩与打包+tar打包解包+NFS
    反转数字
    取出列表中第N大的数
    nginx负载均衡
    DNS解析
    浅谈Http长连接和Keep-Alive以及Tcp的Keepalive
    django_orm操作
    多线程下的单例模式
    装饰器实现单例模式
    Django model 中的 class Meta 详解
  • 原文地址:https://www.cnblogs.com/ganhang-acm/p/5357239.html
Copyright © 2011-2022 走看看