1.什么是栈
栈 又称为堆栈或堆叠,栈作为一种数据结构,是一种只能在一端进行插入和删除操作的特殊线性表。它按照先进后出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈项,需要读数据的时候从栈页开始弹出数据(最后一个数据被第一个读出来)先进后出。栈具有记忆作用,对栈的插入与删除操作中,不需要改变栈底指针。
栈是允许在一端进行插入和删除操作的特殊线性表。允许进行插入和删除操作的一端称为栈项(top),另一端为栈底(bottom);栈底固定,而栈顶浮动;栈中元素个数为零时称为空栈。插入一般称为进栈(PUSH) ,删除则称为退栈(P0P)。由于堆叠数据结构只允许在一端进行操作,因而按照后进先出的原理运作。栈也称为后进先出表。图示结构
我们 用一道题目演示栈的工作原理:
一个栈的入栈序列为A B C D 则不可能的输出序列为()?
A: A B C D B: D C B A C: A C D B D: D A B C
分析:因为栈的存储原理是先进后出的
所以对于A来说,push(A)-->pop()-->push(B)-->pop()-->push(C)-->pop()-->push(D)-->pop() 是可以实现 abcd的顺序的
对于B来说,push(A)-->push(B)-->push(C)-->push(D)-->pop()-->pop()-->pop()-->pop(),同样可以实现dcba
对于C来说,push(A)-->pop()-->push(B)-->push(C)-->pop()-->push(D)-->pop()-->pop(),同样可以实现acdb
对于D来说,要想D先出栈,D只有在栈定,所以只有push(A)-->push(B)-->push(C)-->push(D)-->pop()-->pop()-->pop()-->pop(),dcba这种结构,所以D是错误的
2.我们用java代码模拟栈的存储原理
package com.cym.datastructure.stack;
/**
* 用代码代码模拟stack的实现
* 用数组来模拟
*/
public class Stack {
//定义一个数组来模拟stack
private Object [] objectArray;
//定义stack的最大长度
private int maxSize;
//定义一个栈顶的变量
private int top;
public Stack(int maxSize) {
this.maxSize = maxSize;
//定义top的初始值-1,为-1的时候表示栈为null
top = -1;
objectArray = new Object[maxSize];
}
/**
* 定义入栈的方法
* @param object
*/
public void push(Object object){
//top < maxSize-1表示栈还没有满
if (top < maxSize-1){
//表示在栈的++top索引处加入数据object
objectArray[++top] = object;
}
}
/**
* 弹栈操作;从栈顶操作,使用数组来模拟;
* @return
*/
public Object pop(){
//弹出栈顶元素,同时栈的大小-1;
return objectArray[top--];
}
/**
* 访问栈定元素(不是弹出所以栈的大小不用改变)
* @return
*/
public Object peek(){
return objectArray[top];
}
/**
* 判断栈是否为空
* @return
*/
public boolean isEmpty(){
return top==-1;
}
/**
* 判断栈是否满了
* @return
*/
public boolean idPull(){
return top == maxSize-1;
}
public static void main(String[] args) {
Stack stack = new Stack(4);
System.out.println("A:");
//模拟上述题目的A选项
stack.push("A");
System.out.print(stack.pop()+"\t");
stack.push("B");
System.out.print(stack.pop()+"\t");
stack.push("C");
System.out.print(stack.pop()+"\t");
stack.push("D");
System.out.print(stack.pop()+"\t");
System.out.println();
System.out.println("B:");
//模拟上述题目的B选项
stack.push("A");
stack.push("B");
stack.push("C");
stack.push("D");
while (!stack.isEmpty()){
System.out.print(stack.pop()+"\t");
}
System.out.println();
System.out.println("C:");
//模拟上述题目的C选项
stack.push("A");
System.out.print(stack.pop()+"\t");
stack.push("B");
stack.push("C");
System.out.print(stack.pop()+"\t");
stack.push("D");
System.out.print(stack.pop()+"\t");
System.out.print(stack.pop()+"\t");
}
}
输出:
A:
A B C D
B:
D C B A
C:
A C D B
3.利用栈的存储原理实现字符串的反转
package com.cym.datastructure.stack;
import java.util.Stack;
/**
* 利用栈的原理实现把字符串的反转
*/
public class StringInversion {
public static void main(String[] args) {
//创建Stack对象,当然这个Stack是jdk提供的,不是我们自定义的
Stack stack = new Stack();
//定义要反转的字符串
String str = "Today I was in review stack";
//把字符串变成字符数组
char[] chars = str.toCharArray();
for (char c : chars){ stack.push(c); }
//出栈
while(!stack.isEmpty()){
System.out.print(stack.pop());
}
}
}
输出:
kcats weiver ni saw I yadoT