栈的学习-四则运算实例

来源:互联网 发布:经传软件吧 编辑:程序博客网 时间:2024/06/05 11:52

栈和队列

栈和队列是两种特殊的线性表,特殊之处在于插入与删除操作的位置受到限制,若插入和删除只能在线性表的一端进行,则为栈,特点是后进先出(LIFO);若插入和删除操作分别在线性表的两端进行,则为队列,特点是先进先出(FIFO)。
栈按不同的存储结构又分为顺序栈和链式栈,使用的时候可根据具体情况选择。当有频繁的插入删除操作是选取链式存取结构较好。

java中使用栈

1、Stack类

Stack 类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类 Vector 进行了扩展 ,允许将向量视为堆栈。它提供了通常的 push 和 pop 操作,以及取堆栈顶点的 peek 方法、测试堆栈是否为空的 empty 方法、在堆栈中查找项并确定到堆栈顶距离的 search 方法。 首次创建堆栈时,它不包含项。Deque 接口及其实现提供了 LIFO 堆栈操作的更完整和更一致的 set,应该优先使用此 set,而非此类

2、Deque接口

一个线性 collection,支持在两端插入和移除元素。名称 deque 是“double ended queue(双端队列)”的缩写,通常读为“deck”。大多数 Deque 实现对于它们能够包含的元素数没有固定限制,但此接口既支持有容量限制的双端队列,也支持没有固定大小限制的双端队列。此接口定义在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。插入操作的后一种形式是专为使用有容量限制的 Deque 实现设计的;在大多数实现中,插入操作不能失败。

在将双端队列用作堆栈时,元素被推入双端队列的开头并从双端队列开头弹出。堆栈方法完全等效于 Deque 方法,如下表所示:

操作 推展方法 等效Deque方法 入栈 push(e) addFirst(e) 出栈 pop() removeFirst() 得到栈顶元素 peek() peekFirst()

Deque实现的子类有ArrayDeque,LinkedList,LinkedBlockingDeque。

  1. ArrayDeque类
    Deque接口的大小可变数组的实现。数组双端队列没有容量限制;它们可根据需要增加以支持使用。它们不是线程安全的;在没有外部同步时,它们不支持多个线程的并发访问。禁止 null 元素。此类很可能在用作堆栈时快于 Stack,在用作队列时快于 LinkedList。
  2. LinkedList类
    此类实现 Deque接口,为 add、poll 提供先进先出队列操作,以及其他堆栈和双端队列操作。

栈的应用-四则运算

问题:对于一个算术表达式,如1+2*(3-4)+5,假定该表达式以通过编译系统的语法检查,怎么求解该表达式的值。

解题思路:先将中缀表达式转化为后缀表达式,然后对后缀表达式进行求解。

中缀表达式:即如题所示的表达式,运算符写在两个操作数的中间,由于运算符具有不同的优先级,圆括号会改变运算的次序,使得运算起来比较复杂。
后缀表达式:将运算符卸载两个操作数之后的表达式。可以严格按顺序计算,方便运算。如题的表达式转化为后缀表达式为,1 2 3 4 - * + 5 +

实现:

    //将中缀表达式转为后缀表达式 1+2*(3-4)+5    public static String toPostfix(String expstr){        Deque<String> deque=new ArrayDeque<String>(expstr.length()); //创建运算符栈        String postfix="";//后缀表达式        int i=0;        while(i<expstr.length()){            char ch=expstr.charAt(i);            switch(ch){            case '+':            case '-':                while(!deque.isEmpty() && !deque.getFirst().equals("(")){                    postfix+=deque.removeFirst();                }                deque.addFirst(ch+"");                i++;                break;            case '*':            case '/':                while(!deque.isEmpty() && (deque.getFirst().equals("*") || deque.getFirst().equals("/"))){                    postfix+=deque.removeFirst();                }                deque.addFirst(ch+"");                i++;                break;            case '(':                deque.addFirst(ch+"");                i++;                break;            case ')':                String out=deque.removeFirst();                while(out!=null && !out.equals("(")){                    postfix+=out;                    out=deque.removeFirst();                }                i++;break;            default:                    while(i<expstr.length() && ch>='0' && ch<='9'){                        postfix+=ch;                        i++;                        if(i<expstr.length())                            ch=expstr.charAt(i);                    }                    postfix+=" ";            }        }        while(!deque.isEmpty()){            postfix+=deque.removeFirst();        }        return postfix;    }
//后缀表达式:1 2 3 4 -*+5 + 计算后缀表达式的值    public static int countValue(String postfix){        Deque<Integer> deque=new LinkedList<Integer>(); //创建操作数栈        int i=0,result=0;        while(i<postfix.length()){            char ch=postfix.charAt(i);            if(ch>='0' && ch<='9'){                result=0;                while(ch!=' '){                    result=result*10+Integer.parseInt(ch+"");                    i++;                    ch=postfix.charAt(i);                }                i++;                deque.addFirst(new Integer(result));            }else{                int y=deque.removeFirst();                int x=deque.removeFirst();                switch(ch){                case '+':result=x+y;break;                case '-':result=x-y;break;                case '*':result=x*y;break;                case '/':result=x/y;break;                }                deque.addFirst(new Integer(result));                i++;            }        }        return deque.removeFirst().intValue();    }

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 中国人在外国遇到危险怎么办 dnf刷图卡住了怎么办 dbf深渊怪卡住了怎么办 dnf86级没任务了怎么办 dnf二觉任务没了怎么办 脚趾甲变空向上翘怎么办 汽油车加了一点柴油怎么办 柴油车辆环保检测功率不足怎么办 加95加错一次92怎么办 新车95加错92油怎么办 加不到95号汽油怎么办 去新疆没95号油怎么办 黄龙300加了92怎么办 gla错加92号油 怎么办 95和98混加了怎么办 沥青车可以停在居民区怎么办 汽油进到眼睛了怎么办 汽油进了眼睛里怎么办 眼睛里面进了汽油怎么办 脱硫塔里的二氧化硫高怎么办 恐怖黎明铁匠选错怎么办 堡垒之夜草变色怎么办 火柴没有擦的了怎么办 乙醚倒进下水道了怎么办 乙醚和水不分层怎么办 乙醚闻多了头晕怎么办 爱乐维吃了便秘怎么办 刮完滑石粉墙面很软怎么办 被硫酸泼到皮肤怎么办 头磕了一下头晕怎么办 家里有事与工作不能请怎么办 撞了头头晕想吐怎么办 猫不小心摔一下怎么办 一氧化二氮中毒怎么办 电脑开机变慢了怎么办 怎么办抚顺韦德健身卡 预售健身卡合法吗怎么办 被浓硫酸泼到怎么办 婴儿误喝了生水怎么办 宝宝喝了生水拉肚子怎么办 因妈妈喝生水宝宝拉肚子怎么办