JAVA——栈的基本用法

本文介绍了栈这种数据结构的基本概念和特性,包括它的先进后出(LIFO)原则。文章讨论了栈可以用单链表实现,但数组在实现栈时具有更好的效率。在JAVA中,通过Stack类可以方便地进行入栈、出栈、查看栈顶元素等操作。此外,还展示了如何自定义一个栈,包括使用数组实现栈并进行扩容、判断栈满和空等操作。代码示例展示了自定义栈的使用,包括push、pop、peek和empty等方法。
摘要由CSDN通过智能技术生成


一、基本介绍

1.概念

栈:(先进后出)

一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则。

压栈:

栈的插入操作叫做进栈/压栈/入栈,入数据在栈顶。

出栈:

栈的删除操作叫做出栈。出数据在栈顶。

在这里插入图片描述

2.栈能用单链表实现吗?

单链表尾插法每次得找到末尾才能插入,不占优势。下面介绍的都由数组实现。

实现方式入栈出栈时间复杂度
数组O(1)
单链表头插法 :O(1)尾插法:O(N)

二、JAVA集合类对应的栈(Stack)

向栈中存放元素:stack.push();
获取栈顶元素:stack.peek();
删除栈顶元素(返回值为删除的元素):stack.pop();

 public static void main2(String[] args) {
        Stack<Integer> stack = new Stack<>();//创建一个栈
       //向栈中存放1,2,3个元素
        stack.push(1);
        stack.push(2);
        stack.push(3);
        System.out.println(stack.peek());//获取栈顶元素 但是不删除 结果为3
        System.out.println(stack.pop());//弹出栈顶元素 删除  结果为3
        System.out.println(stack.peek());//获取栈顶元素 但是不删除 结果为2
        System.out.println(stack.empty());//判断栈中元素是否为空
        System.out.println(stack.isEmpty());//判断是否为空 

    }

三、自己实现栈的基本操作

1.开辟一个栈的空间
2.push往栈中存放元素要判断栈满没满,满了进行扩容,没满则存放到数组最后的位置。
3.pop删除栈顶元素要判断栈是否为空

public class MyStack {
    public int[] elem;//开辟一个栈的空间
    public int usedSize;//栈实际用的长度

    public MyStack() {
        this.elem = new int[10];//设置栈的空间为10个元素的空间
    }

//push往栈中存放元素要判断栈满没满
    public boolean isFull() {
        //数据个数==长度了
        if (this.usedSize == this.elem.length) {
            return true;
        }
        return false;
    }

    public void push(int item) {
        if (isFull()) {
            //满了进行扩容
            this.elem = Arrays.copyOf(this.elem, 2 * elem.length);
        }
        //没满,存放到数组最后的位置
        this.elem[this.usedSize] = item;
        this.usedSize++;
    }


    //pop删除栈顶元素要判断栈是否为空
    public boolean empty(){
        //数据个数为空的时候
        return this.usedSize==0;
    }

    public int pop() throws RuntimeException {
        if (empty()) {
            throw new RuntimeException("栈空了");
        }
        int val=this.elem[this.usedSize-1];
        this.usedSize--;
        return val;
    }

    //获取栈顶元素
    public int peek(){
        if(empty()){
            throw new RuntimeException("栈空了");
        }
        return this.elem[this.usedSize-1];
    }


    public static void main(String[] args) {
        MyStack myStack = new MyStack();
        myStack.push(1);
        myStack.push(2);
        myStack.push(3);
        System.out.println(myStack.peek());//获取栈顶元素 但是不删除 结果为3
        System.out.println(myStack.pop());//弹出栈顶元素 删除  结果为3
        System.out.println(myStack.peek());//获取栈顶元素 但是不删除 结果为2
        System.out.println(myStack.empty());//结果为false
      System.out.println(myStack.pop());//2
        System.out.println(myStack.pop());//1
        System.out.println(myStack.pop());//证明为空报异常
    }
}
关于的使用,内有关于使用的示例 的应用举例 1. 将10进制正整数num转换为n进制 private String conversion(int num, int n) { MyStack myStack = new MyArrayStack(); Integer result = num; while (true) { // 将余数入 myStack.push(result % n); result = result / n; if (result == 0) { break; } } StringBuilder sb = new StringBuilder(); // 按出的顺序倒序排列即可 while ((result = myStack.pop()) != null) { sb.append(result); } return sb.toString(); } 2. 检验符号是否匹配. '['和']', '('和')'成对出现时字符串合法. 例如"[][]()", "[[([]([])()[])]]"是合法的; "([(])", "[())"是不合法的. 遍历字符串的每一个char, 将char与顶元素比较. 如果char和顶元素配对, 则char不入, 否则将char入. 当遍历完成时为空说明字符串是合法的. public boolean isMatch(String str) { MyStack myStack = new MyArrayStack(); char[] arr = str.toCharArray(); for (char c : arr) { Character temp = myStack.pop(); // 为空时只将c入 if (temp == null) { myStack.push(c); } // 配对时c不入 else if (temp == '[' && c == ']') { } // 配对时c不入 else if (temp == '(' && c == ')') { } // 不配对时c入 else { myStack.push(temp); myStack.push(c); } } return myStack.isEmpty(); } 3. 行编辑: 输入行中字符'#'表示退格, '@'表示之前的输入全都无效. 使用保存输入的字符, 如果遇到'#'就将顶出, 如果遇到@就清空. 输入完成时将中所有字符出后反转就是输入的结果: private String lineEdit(String input) { MyStack myStack = new MyArrayStack(); char[] arr = input.toCharArray(); for (char c : arr) { if (c == '#') { myStack.pop(); } else if (c == '@') { myStack.clear(); } else { myStack.push(c); } } StringBuilder sb = new StringBuilder(); Character temp = null; while ((temp = myStack.pop()) != null) { sb.append(temp); } // 反转字符串 sb.reverse(); return sb.toString(); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值