栈
栈的介绍
- 栈的英文为(stack)
- 栈是一个先入后出(FILO-First InLast Out)的有序列表。
- 栈(stack)是 限制线性表中元素的插入和删除只能在线性表的同一端进 行的一种特殊线性表。允许插入和删除的一端,为变化的一端, 称为栈顶(Top), 另一端为固定的一 端,称为栈底(Bottom)。
- 根据栈的定义可知,最先放入栈中元素在栈底,最后放入的元素在栈项,而删除元素刚好相反,最后放入的元素最先删除,最先放入的元素最后删除
实现栈的思路分析
1.使用数组来模拟栈
2.定义一个top来表示栈顶,初始化为-1
3.入栈的操作,当有数据加入到栈时,top++; stack[top] = data;
4.出栈的操作,int value = stack[top]; top–, return valuel
下面代码包括栈的定义,push(入栈),pop(出栈)等的代码实现,还有简单的代码测试。
package stack;
import java.util.Scanner;
public class ArrayStackDemo {
public static void main(String[] args) {
//模拟测试栈
ArrayStack arrayStack = new ArrayStack(5);
String key = "";
boolean loop = true;//循环标识
Scanner scanner = new Scanner(System.in);
while(loop){
System.out.println("shouw:显示栈的元素");
System.out.println("push:入栈");
System.out.println("pop:出栈");
System.out.println("exit:退出");
System.out.printf("请输入选择:");
key = scanner.next();
switch(key){
case "show":
arrayStack.list();
break;
case "push":
System.out.printf("输入一个数:");
int value = scanner.nextInt();
arrayStack.push(value);
break;
case "pop":
try{
System.out.printf("出栈的数:%d\n",arrayStack.pop());
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop = false;
break;
default:
System.out.println("输入非法,重新输入!");
break;
}
}
System.out.println("程序退出!");
}
}
//定义一个栈
class ArrayStack{
private int maxSize;//栈的最大容量
private int[] stack;
private int top = -1;//top栈底,初始化-1;
//构造器
public ArrayStack(int maxSize){
this.maxSize = maxSize;
stack = new int[this.maxSize];
}
//判满
public boolean isFull(){
return top == maxSize-1;
}
//判空
public boolean isEmpty(){
return top == -1;
}
//入栈 push
public void push(int value){
//判满
if (isFull()){
System.out.printf("栈满。\n");
return;
}
top ++;
stack[top] = value;
}
//出战 pop 栈顶数据返回
public int pop(){
//判空
if (isEmpty()){
throw new RuntimeException("栈空,无数据");
}
int value = stack[top];
top--;
return value;
}
//栈的遍历
public void list(){
if (isEmpty()){
System.out.println("栈空");
return;
}
for (int i = top;i >= 0;i--){
System.out.printf("stack[%d]=%d\n",i,stack[i]);
}
}
}