数组模拟栈代码实现
package com.springboot.数据结构.stack;
import java.util.Scanner;
/**
* @author: 牧羊
* @Date: 2020/4/29 15:28
* 数组模拟栈的实现
*/
public class ArrStack {
public static void main(String[] args) {
//测试一下ArrayStack是否正确
//先创建一个ArrayStack想 - 表示栈
ArrayStack stack = new ArrayStack(4);
String key = "";
//控制是否退出菜单
boolean loop = true;
Scanner scanner = new Scanner(System.in);
while(loop){
System.out.println("show : 表示显示栈");
System.out.println("exit : 退出程序");
System.out.println("push : 表示添加数据到栈(入栈)");
System.out.println("pop : 表示从栈取出数据(出栈)");
key = scanner.next();
switch (key){
case "show":
stack.list();
break;
case "push":
System.out.println("请输入一个数");
int value = scanner.nextInt();
stack.push(value);
break;
case "pop":
try{
int res = stack.pop();
System.out.println("出栈的数据:" + res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出~~~");
}
}
class ArrayStack{
private int maxSize; //栈的大小
private int[] stack; //数组,数组模拟栈,数据放到数组当中
private int top = -1; //top表示栈顶
//构造器
public ArrayStack(int maxSize){
this.maxSize = maxSize;
stack = new int[maxSize];
}
//栈满
public boolean isFull(){
return maxSize - 1 == top;
}
//栈空
public boolean isNull(){
return top == -1;
}
//入栈
public void push(int value){
//先判断是否栈满
if(isFull()){
System.out.println("栈满");
return;
}
top++;
stack[top] = value;
}
//出栈
public int pop(){
//先判断栈是否为空
if(isNull()){
throw new RuntimeException("栈空,没有数据");
}
int value = stack[top];
top--;
return value;
}
//遍历
public void list(){
if(isNull()){
System.out.println("栈空");
return;
}
//从栈顶开始遍历
for(int i = top ; i >= 0 ; i--){
System.out.println("出栈:" + stack[i]);
}
}
}
链表模拟栈
package com.springboot.数据结构.stack;
import java.util.Scanner;
/**
* @author: 牧羊
* @Date: 2020/4/29 15:28
* 链表模拟栈的实现
*/
public class LinkedStack {
public static void main(String[] args) {
//测试一下ArrayStack是否正确
//先创建一个ArrayStack想 - 表示栈
ArrayStack stack = new ArrayStack(4);
String key = "";
//控制是否退出菜单
boolean loop = true;
Scanner scanner = new Scanner(System.in);
while(loop){
System.out.println("show : 表示显示栈");
System.out.println("exit : 退出程序");
System.out.println("push : 表示添加数据到栈(入栈)");
System.out.println("pop : 表示从栈取出数据(出栈)");
key = scanner.next();
switch (key){
case "show":
stack.list();
break;
case "push":
System.out.println("请输入一个数");
int value = scanner.nextInt();
stack.push(value);
break;
case "pop":
try{
int res = stack.pop();
System.out.println("出栈的数据:" + res);
}catch (Exception e){
System.out.println(e.getMessage());
}
break;
case "exit":
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序退出~~~");
}
}
class LinkStack{
private Node stack = new Node(5); //链表,链表模拟栈,数据放到链表当中
//栈满
public boolean isFull(){
if(stack.pro != null){
if(stack.pro.no > stack.maxSize){
return true;
}
}
return false;
}
//栈空
public boolean isNull(){
return stack.naxt == null;
}
//入栈
public void push(Node node){
//先判断是否栈满
if(isFull()){
System.out.println("栈满");
return;
}
//定义一个辅助变量
Node temp = stack;
if(temp.pro == null){
temp.naxt = node;
temp.pro = node;
node.naxt = temp;
node.pro = temp;
}else{
//获取最后的一个链表的值
Node lastNode = temp.pro;
lastNode.naxt = node;
node.pro = lastNode;
node.naxt = temp;
temp.pro = node;
}
}
//出栈
public int pop(){
//先判断栈是否为空
if(isNull()){
throw new RuntimeException("栈空,没有数据");
}
//出栈值
Node lastNode = stack.pro;
//如果链表中只有两个数据
if(lastNode.pro == stack){
stack.pro = null;
stack.naxt = null;
}else{
lastNode.pro.naxt = stack;
stack.pro = lastNode.pro;
}
return lastNode.no;
}
//遍历
public void list(){
if(isNull()){
System.out.println("栈空");
return;
}
Node temp = stack;
//从栈顶开始遍历
while (true){
if(temp.pro != null){
System.out.println("出栈:" + temp.pro.no);
Node lastNode = temp.pro;
if(lastNode.pro == temp){
stack.pro = null;
stack.naxt = null;
}else{
lastNode.pro.naxt = temp;
temp.pro = lastNode.pro;
}
}
break;
}
}
}
class Node{
public int maxSize; //最大数
public int no; //编号
public String name; //姓名
public Node naxt; //下一个
public Node pro; //上一个
public Node(int maxSize){
this.maxSize = maxSize;
this.no = 0;
this.name = "";
}
@Override
public String toString() {
return "Node{" +
"no=" + no +
'}';
}
}