栈的介绍:
## 栈的一个实际需求:
请输入一个表达式:
计算式:7x2-5+1-5x3-3
请计算这个表达式的结果为多少?
那么计算机如果要实现如上式的复杂运算,就需要栈的应用
## 栈的介绍
①栈的英文:stack
②栈是一个先入后出的有序列表;
3)栈是限制线性表中元素的插入和删除只能在线性表的同一端进行的一种特殊线性表,允许插入和删除的一端,为变化的一端,称为栈顶(top),另一端为固定的一端,成为栈底(Bottom).
④根据栈的定义可知,最先放入栈的元素在栈底,最后放入栈的元素在栈顶。而取出元素时恰恰相反,最后放入栈的元素先取出,最先放入栈的元素最后取出。
顺序栈(数组模拟栈):
由于栈是一个有序列表,当然可以用数组的结构来储存栈的数据内容。下面我们就用数组来实现入栈(push),出栈(pop)等操作。
思路分析:
1,定义一个top来表示栈顶
2,入栈的操作,当有数据加入栈时,top++;stack[top]=value;
3,出栈的操作,int value = stack[top];top–;return value;
代码如下:
package 顺序栈;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//测试一下ArrayStack是否正确
//先创建ArrayStack对象-》表示栈
ArrayStack s1 = new ArrayStack(4);
String key = "";
boolean loop = true;//控制是否退出菜单
Scanner input = new Scanner(System.in);
while(loop){
System.out.println("show:表示显示栈");
System.out.println("exit:表示退出栈");
System.out.println("push:表示添加数据到栈");
System.out.println("pop:表示取出数据到栈");
key = input.next();
switch (key) {
case "show":
s1.show();
break;
case "exit":
loop = false;
break;
case "push":
int value = input.nextInt();
s1.push(value);
break;
case "pop":
try {
int res = s1.pop();
System.out.printf("取出的数据为%d",res);
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
System.out.println("程序已退出~~@-@");
}
}
//定义一个ArrayStack表示栈
class ArrayStack {
private int maxSize; //栈的大小
private int[] stack; //数组,数组模拟栈,数据就放在该数组
private int top = -1; //top表示栈顶,初始化为-1;
//构造器
public ArrayStack(int maxSize) {
super();
this.maxSize = maxSize;
stack = new int[this.maxSize];//数组初始化
}
//栈满
//思路:只要top到达数组顶端即可
public boolean isFull(){
return top == maxSize - 1;
}
//栈空
//思路:只要top等于-1即可
public boolean isEmpty(){
return top == -1;
}
//入栈:添加数据到栈
public void push(int value){
//先判断栈是否满
if(isFull()){
System.out.println("栈满~~~~~");
return;
}
top++;
stack[top] = value;
}
//出栈:取出数据从栈
public int pop(){
//判断是否栈空
if(isEmpty()){
throw new RuntimeException("栈空~~~~");
}
int value = stack[top];
top--;
return value;
}
//显示栈的情况【遍历栈】,遍历时,需要从栈顶开始显示数据
public void show(){
if(isEmpty()){
System.out.println("栈已空~~```");
return;
}
for(int i=top;i>=0;i--){
System.out.printf ("stack[%d] = %d\n",i,stack[i]);
}
}
}
运行结果可以读者编译运行一下
链式栈(链表模拟栈):
与数组同样,链表也是一个有序列表,当然也可以作为存储栈的工具
思路分析:
1,定义一个top来表示栈顶
2,入栈的操作,当有数据加入栈时
top.next = heroNode;
top = top.next;
3,出栈的操作:
HeroNode t = top;
top = temp;
return t;
代码如下:
package 链式栈;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//测试一下LinkedStack是否正确
//先创建LinkedStack对象-》表示栈
LinkedStack l1 = new LinkedStack();
String key = "";
boolean loop = true;//控制是否退出菜单
Scanner input = new Scanner(System.in);
while(loop){
System.out.println("show:表示显示栈");
System.out.println("exit:表示退出栈");
System.out.println("push:表示添加数据到栈");
System.out.println("pop:表示取出数据到栈");
key = input.next();
switch (key) {
case "show":
l1.show();
break;
case "exit":
loop = false;
break;
case "push":
System.out.println("请输入要输入的数据");
HeroNode value = new HeroNode(input.nextInt(),input.next(),input.next());
l1.push(value);
break;
case "pop":
try {
System.out.println(l1.pop().toString());
} catch (Exception e) {
// TODO: handle exception
System.out.println(e.getMessage());
}
break;
default:
break;
}
}
System.out.println("程序已退出~~~~");
}
}
//定义一个LinkedStack表示栈
class LinkedStack {
//创建头节点
HeroNode head = new HeroNode(0,"","");
//top表示栈顶,初始化为head
HeroNode top = head;
//栈空
public boolean isEmpty(){
return top == head;
}
//入栈push:添加数据到栈
public void push(HeroNode heroNode){
top.next = heroNode;
top = top.next;
}
//出栈pop:取出数据从栈
public HeroNode pop(){
//先判断是否栈空
if(isEmpty()){
throw new RuntimeException("栈空~`");
}
//需要一辅助变量temp,指向pop的前一个节点
HeroNode temp = head;
while(true){
if(temp.next == top){
break;
}
temp = temp.next;
}
HeroNode t;
t = top;
top = temp;
return t;
}
//显示栈
public void show(){
//先判断是否空
if(isEmpty()){
System.out.println("栈空,没有数据~~~");
return;
}
HeroNode temp = head.next;
while(true){
if(temp == top.next){
break;
}
System.out.println(temp);
temp = temp.next;
}
}
}
class HeroNode{
int no;
String name;
String nickName;
HeroNode next;
public HeroNode(int no, String name, String nickName) {
super();
this.no = no;
this.name = name;
this.nickName = nickName;
}
@Override
public String toString() {
return "HeroNode [no=" + no + ", name=" + name + ", nickName="
+ nickName + "]";
}
}