数据结构学习笔记—栈和队列实例

1.最小栈

//实现一个最小栈【力扣155】
//题目:设计一个支出push,pop,top(peek) 操作,并能在常数时间内检索到最小元素的栈
/*逻辑
push
1.普通栈当中一定要放的,最小栈当中放不放? 取决于当前元素X有没有最小栈的栈顶元素小
2.如果要存放的值为X,最小栈的栈顶元素时Y
   X<Y 放, X==Y 放且必须放, X>Y 不放
 */
public class MinStack {

    private Stack<Integer> stack1;
    private Stack<Integer> minStack;

    public MinStack(){
        stack1 = new Stack<>();
        minStack = new Stack<>();
    }

    public void push(int val){
        stack1.push(val);
        if (minStack.empty()){
            minStack.push(val);
        }else {
            int x = minStack.peek();
            if (val <= x){
                minStack.push(val);
            }
        }
    }

    public void pop(){
        if (!stack1.empty()){
            int x = stack1.pop();
            if(x == minStack.peek()){
                minStack.pop();
            }
        }
    }

    //只针对 普通栈来说的 获取普通栈的栈顶元素 相当于peek函数
    public int top(){
        if (!stack1.empty()){
            return stack1.peek();
        }
        return -1;//不要抛出异常
    }

    public int getMin(){
        if (minStack.empty()){
            return -1;
        }
        return minStack.peek();
    }
}

2.环形队列

//环形队列【力扣622】
public class MyCircularQueue {

    private int[] elem;
    public int front;//队头
    public int rear;//队尾

    public MyCircularQueue(int k){
        elem = new int[k+1];
    }
    //入队列
    public boolean enQueue(int value){
        if (isFull()){
            return false;
        }
        elem[rear] = value;
        rear = (rear + 1) % elem.length;
        return true;
    }

    //浪费一个空间判断满
    public boolean isFull(){
        if ((rear + 1) % elem.length == front){
            return true;
        }
        return false;
    }
    //出队列
    public boolean deQueue(){
        if (isEmpty()){
            return false;
        }
        front = (front + 1) % elem.length;
        return true;
    }

    public boolean isEmpty(){
        if (front == rear){
            return true;
        }
        return false;
    }
    //获取队头元素
    public int Front(){
        if (isEmpty()){
            return -1;
        }
        return elem[front];
    }
    //获取队尾元素
    public int Rear(){
        if (isEmpty()){
            return -1;
        }
        int index = rear == 0 ? elem.length-1 : rear-1;
        return elem[index];
    }

}

3.用栈实现队列 

public class MyDeQueue {
    //用栈实现队列
    //栈需要两个
    //1.入队:直接放到第一个栈当中
    //2.出第二个栈当中的数据,如果第二个栈没有数据,那么就把第一个栈当中,所有数据倒入第二个栈
    private Stack<Integer> s1;
    private Stack<Integer> s2;
    public MyDeQueue(){
        s1 = new Stack<>();
        s2 = new Stack<>();
    }

    public void push(int x){
        s1.push(x);
    }
    public int pop(){
        if (empty()){
            return -1;
        }
        if (s2.empty()){
            while (!s1.empty()){
                s2.push(s1.pop());
            }
        }
        return s2.pop();
    }

    public int peek(){
        if (empty()){
            return -1;
        }
        if (s2.empty()){
            while (!s1.empty()){
                s2.push(s1.pop());
            }
        }
        return s2.peek();
    }
    //如果两个栈都是空 那么队列就是空
    public boolean empty(){
        return s1.empty() && s2.empty();
    }

}

4.用队列实现栈

public class MyDeStack {
    //1.用队列实现栈【力扣225】
    //使用两个队列实现一个栈
    //思路
    //入栈:入到不为空的队列当中
    //出栈:就是找到不为空的队列,出size-1个元素到另一个队列当中去
    private Queue<Integer> qu1;
    private Queue<Integer> qu2;

    public MyDeStack(){
        qu1 = new LinkedList<>();
        qu2 = new LinkedList<>();
    }

    public void push(int x){
        if (qu1.isEmpty()){
            qu1.offer(x);
        }else if (qu2.isEmpty()){
            qu2.offer(x);
        }else {
            //两个队列都为空的时候
            qu1.offer(x);
        }
    }

    public int pop(){
        if (empty()){
            return -1;
        }
        if (!qu1.isEmpty()){
            int size = qu1.size();
            for (int i = 0; i < size-1; i++) {
                qu2.offer(qu1.poll());
            }
            return qu1.poll();
        }else {
            int size = qu2.size();
            for (int i = 0; i < size-1; i++) {
                qu1.offer(qu2.poll());
            }
            return qu2.poll();
        }
    }
    //peek 获取栈顶元素
    public int top(){
        if (empty()){
            return -1;
        }
        if (!qu1.isEmpty()){
            int size = qu1.size();
            int ret = -1;
            for (int i = 0; i < size; i++) {
                ret = qu1.poll();
                qu2.offer(ret);
            }
            return ret;
        }else {
            int size = qu2.size();
            int ret = -1;
            for (int i = 0; i < size; i++) {
                ret = qu2.poll();
                qu1.offer(ret);
            }
            return ret;
        }
    }
    //两个队列都为空,那么就是栈空
    public boolean empty(){
        return qu1.isEmpty() && qu2.isEmpty();
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
你好!关于学习数据结构的C语言笔记,我可以给你一些基本的指导和概念。数据结构是计算机科学中非常重要的一门课程,它涉及存储和组织数据的方法。C语言是一种常用的编程语言,很适合用于实现各种数据结构。 下面是一些数据结构的基本概念,你可以在学习笔记中包含它们: 1. 数组(Array):一种线性数据结构,可以存储相同类型的元素。在C语言中,数组是通过索引访问的。 2. 链表(Linked List):也是一种线性数据结构,但不需要连续的内存空间。链表由节点组成,每个节点包含数据和指向下一个节点的指针。 3. 栈(Stack):一种后进先出(LIFO)的数据结构,类似于装满物品的箱子。在C语言中,可以使用数组或链表来实现栈。 4. 队列(Queue):一种先进先出(FIFO)的数据结构,类似于排队等候的队伍。同样可以使用数组或链表来实现队列。 5. 树(Tree):一种非线性数据结构,由节点和边组成。每个节点可以有多个子节点。二叉树是一种特殊的树结构,每个节点最多有两个子节点。 6. 图(Graph):另一种非线性数据结构,由节点和边组成。图可以用来表示各种实际问题,如社交网络和地图。 这只是数据结构中的一些基本概念,还有其他更高级的数据结构,如堆、哈希表和二叉搜索树等。在学习笔记中,你可以介绍每个数据结构的定义、操作以及适合使用它们的场景。 希望这些信息对你有所帮助!如果你有任何进一步的问题,请随时提问。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值