队列和栈

基础:

1、用数组结构实现大小固定的队列和栈

数组实现栈思路:用一个指针来确定位置,当大于数组长度或者为0时抛出异常

public static class ArrayToStack{
    private Integer[] arr;
    private Integer index;

    public ArrayToStack(int initSize){
        if(initSize < 0){
            throw new IllegalArgumentException("The init size is less than 0");
        }
        arr = new Integer[initSize];
        index = 0;
    }

    public void push(int obj){
        if(index == arr.length){
            throw new ArrayIndexOutOfBoundsException("The queue is full");
        }
        arr[index++] = obj;
    }

    public Integer pop(){
        if(index == 0){
            throw new ArrayIndexOutOfBoundsException("The queue is empty");
        }
        return arr[index--];
    }

    public Integer peek(){
        if(index == 0){
            return null;
        }
        return arr[index - 1];
    }
}

数组实现队列思路:先定义一个size为队列大小,初始size为0,当push添加数时,end+1,直到size满了,再从0开始循环;当poll取数时,size先-1,然后start+1,当start满了,再从0开始循环。

public static class ArrayToQueue{
    private Integer[] arr;
    private Integer size;
    private Integer start;
    private Integer end;

    public ArrayToQueue(int initSize){
        if(initSize < 0){
            throw new IllegalArgumentException("The init size is less than 0");
        }
        arr = new Integer[initSize];
        size = 0;
        start = 0;
        end = 0;
    }
    
    public void push(int obj){
        if(size == arr.length){
            throw new ArrayIndexOutOfBoundsException("The queue is full");
        }
        size++;
        arr[end] = obj;
        end = end == arr.length - 1 ? 0 : end + 1;
    }

    public Integer poll(){
        if(size == 0){
            throw new ArrayIndexOutOfBoundsException("The queue is empty");
        }
        size--;
        int tmp = start;
        start = start == arr.length -1 ? 0 : start + 1;
        return arr[tmp];
    }

    public Integer peek(){
        if(size == 0){
            return null;
        }
        return arr[start];
    }
}
2、实现一个特殊的栈,在栈的基本功能基础上,再实现返回栈中最小元素的操作

【要求】
1.pop、push、getMin操作的时间复杂度都是O(1)
2.设计的栈类型可以使用现成的栈结构

思路:准备两个栈,一个data栈,一个min栈,data栈存数取数,min栈只存最小值,当新来一个数时,与min栈的栈顶元素比较,若小则压入,若大于则不操作,弹出时data栈与min栈同步弹出即可。

public class getMinStack{
    private Stack<Integer> stackMin;
    private Stack<Integer> stackData;

    public getMinStack(){
        this.stackData = new Stack<Integer>();
        this.stackMin = new Stack<Integer>();
    }
    
    public void push(int newNum){
        if(this.stackMin.isEmpty()){
            this.stackMin.push(newNum);
        }
        // 压栈时若新数据小于等于min栈的栈顶元素则压入,否则将min栈栈顶元素重复压入一次
        else if(newNum <= this.getMin()){
            this.stackMin.push(newNum);
        }
        else{
            int newMin = this.stackMin.peek();
            this.stackMin.push(newMin);
        }
        this.stackData.push(newNum);
    }

    public int pop(){
        if(this.stackData.isEmpty()){
            throw new RuntimeException("Your stack is empty.");
        }
        // 同步弹出即可
        this.stackMin.pop();
        return this.stackData.pop();
    }

    public int getMin(){
        if(this.stackMin.isEmpty()){
            throw new RuntimeException("Your stack is empty.");
        }
        return this.stackMin.peek();
    }
}
3、用队列实现栈,用栈实现队列

4、转圈打印矩阵

【题目】 给定一个整型矩阵matrix,请按照转圈的方式打印它。 例如: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 打印结果为:1,2,3,4,8,12,16,15,14,13,9, 5,6,7,11, 10
【要求】 额外空间复杂度为O(1)


5、旋转正方形矩阵

【题目】 给定一个整型正方形矩阵matrix,请把该矩阵调整成 顺时针旋转90度的样子。
【要求】 额外空间复杂度为O(1)。


7、“之”字形打印矩阵
【题目】 给定一个矩阵matrix,按照“之”字形的方式打印这 个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 “之”字形打印的结果为:1,2,5,9,6,3,4,7,10,11, 8,12 【要求】 额外空间复杂度为O(1)。
8、在行列都排好序的矩阵中找数
【题目】 给定一个有N*M的整型矩阵matrix和一个整数K, matrix的每一行和每一 列都是排好序的。实现一个函数,判断K 是否在matrix中。 例如: 0 1 2 5 2 3 4 7 4 4 4 8 5 7 7 9 如果K为7,返回true;如果K为6,返 回false。 【要求】 时间复杂度为O(N+M),额外空间复杂度为O(1)
9、
进阶:
1、括号是否匹配

2、最长括号匹配


3、逆波兰表达式
4、入栈出栈问题

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,172评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,346评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,788评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,299评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,409评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,467评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,476评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,262评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,699评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,994评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,167评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,827评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,499评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,149评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,387评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,028评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,055评论 2 352

推荐阅读更多精彩内容

  • 用两个栈实现队列的头部出队,尾部入队操作: 30、包含min函数的栈 定义栈的数据结构,请在该类型中实现一个能够得...
    世界上的一道风阅读 133评论 0 0
  • 数组 数组的内存是连续的,不同的语言有着不同的分配内存规则。有的需要开始的时候指定长度,有的不需要(当数组的长度不...
    齊葩阅读 1,749评论 1 1
  • 队列和栈 啊哈,我开新坑了 队列 首先,我们来讲解一下什么是队列你们印象中的队列可能是这样子的: [图片上传失败....
    兄主的仙人掌阅读 348评论 0 0
  • 3:队列(QUEUE) 3.1:队列的定义和性质 队列:只允许前端(front,队首)进行删除操作,而在后端(re...
    sanpintian阅读 517评论 0 2
  • 看到阳台上那盆兰草肆意绽放着花朵,有谁能够想到她是曾经奄奄一息,我一度想抛弃、想放弃的那一丛毫无生命力、毫不起眼,...
    纳言纳语阅读 391评论 0 9