【数据结构Java】栈堆1
栈
基本概念:堆栈的一种特殊的线性表,堆栈中元素以及元素之间的逻辑关系和线性表是相同的,操作上的差异:堆栈之允许在固定一端插入和删除元素。
1)栈的英文为(stack)
2)栈是一个先入后出(FILO-First In Last Out)的有序列表。
3)栈(stack)是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表。允许插入和删除的一端,为变化的一端,称为栈顶(Top),另一端为固定的一端,称为栈底(Bottom).
4)根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈顶,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
实现的思路分析
1.使用数组来模拟栈
2.定义一个top来表示栈顶,初始化为-1
3.入栈的操作,当有数据加入到栈时,top++;stack[top]=data;
4.出栈的操作,int value=stack[top];top–,return value
https://img-blog.csdnimg.cn/1c5899adba32435c852ae9574fa3d655.gif
具体方法:
1.判断栈是否满isFull
如果栈顶等于最大栈数-1,则说明栈已经满了无法再添加元素
具体代码
public boolean isFull(){
return top == maxSize - 1;
}
2.入栈push
入栈前要先判断栈是否满了,没满才能入栈。栈顶top后移,将value传入
具体代码:
public void push(int value){
if(isFull()){
System.out.println("栈满");
}
top++;
stack[top] = value;
}
3.出栈pop
同样先判断是否栈满,若满了可以抛出异常提示。就栈中的元素赋值给value,top再向前移,为方便下一次出栈,返回value
具体代码:
public int pop(){
if(isFull()){
throw new RuntimeException("栈满");
}
int value = stack[top];
top--;
return value;
}
4.显示栈中的所有元素list
照旧先判断栈空,这里再运用一个for循环直接显示
public void list(){
if(isFull()){
System.out.println("栈满");
}
for (int i = top; i >=0 ; i--) {
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
全部代码如下:
import java.util.Scanner;
public class StackDemo {
public static void main(String[] args) {
ArrayStack arrayStack = new ArrayStack(4);
String key ;
boolean loop = true;
Scanner scanner = new Scanner(System.in);
while (loop){
System.out.println("s show:显示栈");
System.out.println("e exit:推出");
System.out.println("p push:入栈");
System.out.println("pop :出栈");
System.out.println("输入选择:");
key = scanner.next();
switch (key){
case "s":
arrayStack.list();
break;
case "p":
System.out.println("请输入:");
int value = scanner.nextInt();
arrayStack.push(value);
break;
case "pop":
try {
int res = arrayStack.pop();
}catch (Exception e){
System.out.println(e.getMessage());
}break;
case "e":
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("退出");
}
}
class ArrayStack{
private int top = -1;
private int[] stack;
private int maxSize;
public ArrayStack(int maxSize) {
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
public boolean isFull(){
return top == maxSize - 1;
}
public void push(int value){
if(isFull()){
System.out.println("栈满");
}
top++;
stack[top] = value;
}
public int pop(){
if(isFull()){
throw new RuntimeException("栈满");
}
int value = stack[top];
top--;
return value;
}
public void list(){
if(isFull()){
System.out.println("栈满");
}
for (int i = top; i >=0 ; i--) {
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
}
结果如下:
s show:显示栈
e exit:推出
p push:入栈
pop :出栈
输入选择:
p
请输入:
1
s show:显示栈
e exit:推出
p push:入栈
pop :出栈
输入选择:
p
请输入:
2
s show:显示栈
e exit:推出
p push:入栈
pop :出栈
输入选择:
s
stack[1]=2
stack[0]=1
s show:显示栈
e exit:推出
p push:入栈
pop :出栈
输入选择:
pop
s show:显示栈
e exit:推出
p push:入栈
pop :出栈
输入选择:
s
stack[0]=1
s show:显示栈
e exit:推出
p push:入栈
pop :出栈
输入选择:
这里只是栈的浅谈,日后补充