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技术。