栈与队列,是仅在表尾进行操作的线性表,均有顺序结构和链式结构
先入先出为队列,即 输入 1 2 3 4 5,打印出 1 2 3 4 5
先入后出为栈,即 输入 1 2 3 4 5,打印出 5 4 3 2 1
这里详解栈的顺序结构和链式结构,代码最后附上!!!!!
一。顺序栈
代码结构 两包 一接口,五类
顺序栈所在Stack包
1.Stack.java 栈接口类,下面的链栈也用到此接口
2.顺序栈对象 Mystack.java
3.测试类 Test.java
4.运行结果
二。链栈。所用到以上的stack接口!!!!!一定记得用到了stack接口
1.Stack.java 在上面,有的方法不需要实例化使用
2.Node.java节点类
3.LinkedStack.java 链栈对象类
3.Test.java 测试类
4.运行结果
代码附上!!
第一部分:
Stack.java
package Stack;
//定义栈模板
public interface Stack<E> {
//判断是否为空栈
public boolean Isempty() ;
//判断栈是否满了
public boolean Isfull();
//入栈
public void push(E e);
//出栈
public void pop();
//栈的长度
public int Length();
//打印栈中所有元素
public void FindALL();
//打印栈顶元素
public void FindOne();
}
Mystack.java
package Stack;
//定义一个顺序结构的栈 实现Stack接口
public class MyStack<E> implements Stack<E> {
//定义栈的最大容量,若有兴趣你可以尝试增加一个方法,使其满栈时增加容量
public int Maxsize =10;
//定义数据域,即储存数据的地方
public Object[] obj = null;
//定义栈顶指针,因为顺序结构从零开始计数,所以定义指针为-1,因为指针若为0,表示第一个数据已经存储在里面了
public int top = -1;
//构造函数分为两块,一块是用户不想自己设置最大容量,一块是用户自己输入最大容量
MyStack(){
this.obj = new Object[Maxsize];
}
public MyStack(int Maxsize) {
this.Maxsize = Maxsize;
this.obj = new Object[Maxsize];
// TODO Auto-generated constructor stub
}
@Override
public boolean Isempty() {
// TODO Auto-generated method stub
if(top < 0) return true;
else return false;
}
@Override
public boolean Isfull() {
// TODO Auto-generated method stub
if(top < Maxsize) return false;
else return true;
}
@Override
public void push(E e) {
// TODO Auto-generated method stub
if(Isfull()) {
try {
throw new Exception("满栈无法进行入栈操作");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
//栈顶上移,增加新数据
top++;
obj[top]=e;
}
@Override
public void pop() {
// TODO Auto-generated method stub
if(Isempty()) {
try {
throw new Exception("空栈无法进行操作");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
//打印此时栈顶的元素
System.out.println("此次出栈元素为"+obj[top]);
//直接更新栈顶
top--;
}
@Override
public int Length() {
// TODO Auto-generated method stub
return this.top+1;
}
@Override
public void FindALL() {
// TODO Auto-generated method stub
//因为栈是先进后出,所以在打印数组时进行倒序打印即可
System.out.println("栈中储存的数据是");
for(int j=top;j>=0;j--) {
System.out.print(obj[j]+" ");
}
}
@Override
public void FindOne() {
// TODO Auto-generated method stub
if(Isempty()) {
try {
throw new Exception("空栈无法进行操作");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
System.out.println("此时栈顶元素为"+ obj[top]);
}
}
Test.java
package Stack;
public class Test {
public static void main(String[] args) {
//实例化一个栈
MyStack<String> myStack = new MyStack<String>();
//入栈五条数据
myStack.push("一");
myStack.push("棵");
myStack.push("大");
myStack.push("白");
myStack.push("菜");
//打印栈中数据与栈顶数据
myStack.FindALL();
myStack.FindOne();
//首位元素出栈,再次打印栈中数据与栈顶数据
myStack.pop();
myStack.FindALL();
myStack.FindOne();
}
}
第二部分!!
Node.java
package StackLink;
/*
* 定义节点类,后续合成链表或者对链表进行操作
* */
public class Node<E> {
//节点储存的变量
public Object data;
//指向下一个节点
public Node next = null;
public Node(E data) {
this.data = data;
}
}
LinkedStack.java
package StackLink;
import Stack.Stack;
//切记链式存储下的栈不考虑满不满,毕竟他满不满是由电脑物理内存决定的,而不是认为定义的,
//而这里我比较懒,直接继承了上一个顺序存储栈中的stack模型,所以我对Isfull方法不进行实例化
public class LinkedStack<E> implements Stack<E> {
//定义栈顶,目前是空栈,所以定义出来的节点为null
Node<E> top = null;
//监听节点数量
int i=0;
@Override
public boolean Isempty() {
// TODO Auto-generated method stub
if(top!=null) return false;
else return true;
}
@Override
public boolean Isfull() {
// TODO Auto-generated method stub
return false;
}
@Override
public void push(E e) {
// TODO Auto-generated method stub
Node<E> newNode = new Node<E>(e);
//每次新输入的节点都会成为top,而旧节点则被top的next指向
if(Isempty()) {
top = newNode;
}
else {
Node<E> temp = top;
top = newNode;
top.next = temp;
}
i++;
}
@Override
public void pop() {
// TODO Auto-generated method stub
if(Isempty()) {
try {
throw new Exception("空栈,不能进行出栈操作!!!");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//让栈顶处节点直接变为null,就变相的把节点前一元素的next指向了null,也就把该节点出栈了
top = top.next;
i--;
}
@Override
public int Length() {
// TODO Auto-generated method stub
return i;
}
@Override
public void FindALL() {
// TODO Auto-generated method stub
if(Isempty()) {
try {
throw new Exception("空栈无法进行操作");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
Node<E> mdNode = top;
while(mdNode!=null){
System.out.print(mdNode.data+" ");
mdNode = mdNode.next;
}
}
@Override
public void FindOne() {
// TODO Auto-generated method stub
if(Isempty()) {
try {
throw new Exception("空栈无法进行操作");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
System.out.println("栈顶数据为"+top.data);
}
}
Test.java
package StackLink;
public class Test {
public static void main(String[] args) {
//实例化一个栈
LinkedStack<String> myStack = new LinkedStack<String>();
//入栈五条数据
myStack.push("一");
myStack.push("棵");
myStack.push("大");
myStack.push("白");
myStack.push("菜");
//打印栈中数据与栈顶数据
myStack.FindOne();
myStack.FindALL();
//删除栈顶
myStack.pop();
System.out.println();
//打印栈中数据与栈顶数据
myStack.FindOne();
myStack.FindALL();
}
}