数据结构 栈

栈是一种数据结构,遵循后进先出(LIFO)原则,常用于函数调用、字符串旋转等。栈的操作如压栈和弹栈具有O(1)的时间复杂度,使得它在递归和局部变量管理中表现出色。在实际应用中,栈是函数调用栈的基础,支持高效地嵌套调用和回溯。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、栈的概念:栈是数据结构,数据逻辑结构

2、栈的思路是:后进先出。按照生活中常见的场景形容一下栈,就是堆盘子,你第一个放下的盘子一定是在底部(在栈中的就叫push(压入)),最后一个盘子在顶部,当你想用盘子的时候,一定是从顶部拿起(在栈中就叫做pop(弹出))

3、栈的容器吧:可以用数组、或者链表,而push的就是元素,pop的也是元素。

4、数组实现栈

public class CharStack {
    private int maxSize;
    private char[] arr;
    private int top;

    //构造方法
    public CharStack(int size){
        maxSize=size;
        arr=new char[maxSize];
        top=-1;
    }

    //压入数据
    public void push(char value){
        arr[++top]=value;
    }

    //弹出数据
    public char pop(){
        return arr[top--];
    }

    //访问栈顶元素
    public char peek(){
        return arr[top];
    }

    //栈是否为空
    public boolean isEmpty(){
        return (top==-1);
    }

    //栈是否满了
    public boolean isFull(){
        return (top==maxSize-1);
    }
}

5、旋转字符串

public class Reverse {
    private String input;

    public Reverse(String input){
        this.input=input;
    }

    public String doReverse(){
        CharStack cs=new CharStack(input.length());
        String result="";
        for(int i=0;i<input.length();i++){
            char ch=input.charAt(i);
            cs.push(ch);
        }
        for(int i=0;i<input.length();i++){
            result+=cs.pop();
        }

        return result;
    }
}

public class TestStack {
    public static void main(String[] args) {
        MyStack ms=new MyStack(5);
        ms.push(40);
        ms.push(41);
        ms.push(42);
        ms.push(43);
        ms.push(44);

        while(!ms.isEmpty()){
            System.out.println(ms.pop());
        }

        Reverse re=new Reverse("abcdefg");
        System.out.println(re.doReverse());

    }

}

6、其他
链接:https://www.zhihu.com/question/51390236/answer/125615116

栈有两个特点:

  • 基本栈操作非常简单高效,压栈和弹栈都只有O(1)的复杂度。
  • 压栈和弹栈这一对操作,某种意义上具有“记忆效应”,或者说对称性。

在应用程序开发中,程序员一般也很少直接使用栈这种数据结构。但另一个角度来说,栈也许是世界上使用最广泛、最高频率的数据结构了,那就是函数栈。

一个进程中,每个函数每次被调用的时候,逻辑上都会拥有一块自己的栈内存空间,称为栈帧

基于刚才说的栈的两个特点,函数能够

  • 很容易实现调用完毕后的返回
  • 非常轻松、高效地任意互相嵌套调用(如果内存空间足够大)
  • 非常简单高效地管理局部内存(相对于动态分配的堆内存)

其它大部分情况下,栈数据结构在应用开发中的直接使用,也基本只是用到它能支持递归回溯(也就是嵌套)的特点,比如Java Servlet中的Filter技术。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值