栈和队列是什么?
是概念!是逻辑结构!不是真是存在的!寄托载体不固定!
栈和队列的特征?
栈:先进后出,队列:先进先出
int、double……是数据类型
array、list、map都有各自固定的格式和样式
而栈和队列可以是一个线性表、可以是一个数组……只要是符合“先进后出”结构就可以理解为栈,只要是符合“先进先出”结构就可以理解为队列
一下是用java写出的栈和队列的代码示例:
1、定义数据节点,类名为 NodeClass ,数据类型不定用泛型 T 代替 ,内部定义一个存放数据的私有变量 Data ,其数据类型不定 也用泛型 T 代替;一个指向下一个节点的指针 next 。
package Stack;
public class NodeClass<T> {
private T data;
private NodeClass<T> next;
public T getData() {
return data;
}
public void setData(T data) {
this.data = data;
}
public NodeClass<T> getNext() {
return next;
}
public void setNext(NodeClass<T> next) {
this.next = next;
}
@Override
public String toString() {
return "NodeClass{" +
"data=" + data +
", next=" + next +
'}';
}
}
2、定义一个学生类,用于填在节点的数据域,学生类中包括学生的学号,姓名,其他信息(就是一些比较随便的可以用来区分不同学生的信息)
package Stack;
public class Student {
private int stuNum;
private String name;
private String otherInfo;
public int getStuNum() {
return stuNum;
}
public void setStuNum(int stuNum) {
this.stuNum = stuNum;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getOtherInfo() {
return otherInfo;
}
public void setOtherInfo(String otherInfo) {
this.otherInfo = otherInfo;
}
@Override
public String toString() {
return "Student{" +
"stuNum=" + stuNum +
", name='" + name + '\'' +
", otherInfo='" + otherInfo + '\'' +
'}';
}
}
3->1、定义一个栈结构类,定义栈顶指针,和入栈出栈的方法
package que;
import Stack.NodeClass;
public class StackClass<Student> {
private NodeClass<Student> que; //这是一个栈结构,栈的指针
public NodeClass<Student> getQue() {
return que;
}
public void setQue(NodeClass<Student> que) {
this.que = que;
}
//入栈的方法,将NodeClass类型 的节点 添加到栈中
public void add( NodeClass<Student> add ){
if( que == null ){//判断如果此时que是空的,则将节点直接添加到que所指部分
que = add;
}else{
add.setNext(que);//将所加节点的指向现有栈顶元素
que = add;//将que指向新增加的元素
}
}
public NodeClass<Student> pop(){
NodeClass<Student> result = que;//新定义一个节点用来储存目前的栈顶元素
if( que != null ){
que = que.getNext();//将que指向栈中上一个节点
}
return result;//返回栈顶元素,同时删除此元素
}
public void look(){
System.out.println(que.toString());
}
}
3->2、定义一个队列的结构类,有头指针和尾指针,定义从尾指针入队的方法和从头指针出队的方法
package que;
import Stack.NodeClass;
public class QueClass<T> {
private NodeClass<T> que; //是我们滴队列
private NodeClass<T> end; //是我们滴队列滴尾巴
public NodeClass<T> getQue() {
return que;
}
public void setQue(NodeClass<T> que) {
this.que = que;
}
public NodeClass<T> getEnd() {
return end;
}
public void setEnd(NodeClass<T> end) {
this.end = end;
}
//入队函数,从队尾入队
public void add( NodeClass<T> add ){
if( que == null ){//如果头指针是空,将que指向当前 所添加元素 ,将尾指针也指向此元素,此时,队列中只有一个元素
que = add;
end = que;
}else{//如果队列不是空,将尾指针的next指针指向新加元素add,
end.setNext(add);
end = end.getNext();//将end向后移动一位,此时队列中元素个数增加一个
}
}
//出队函数,从队头出队
public NodeClass<T> pop(){
NodeClass<T> result = que;//定义一个NodeClass类型的节点用来储存 当前队头的元素
if( que != null ){//进行判断,观察此时que指向是不是为空,不为空即将que向后移动一位,即删除que指向的元素
que = que.getNext();
}
return result;//返回刚才的队头元素
}
public void look(){
System.out.println(que.toString());
}
}
**
4、测试类,建立栈的测试类,对其进行入栈和出栈的操作
**
package Stack;
import que.StackClass;
public class TestClass {
public static void main(String[] a){
String[] studentNames = new String[]{
"学生1","学生2","学生3","学生4","学生5","学生6","学生7","学生8",
"学生9","学生10"
};
StackClass<Student> que = new StackClass<Student>();//创建栈结构对象
//循环将学生信息添加都对应节点数据域中,并将节点连接到栈结构中
for( int i = 0; i < studentNames.length; i++ ){
NodeClass<Student> flag = new NodeClass<Student>();//定义一个数据节点。用来接收数据
Student stu = new Student();//创建一个学生对象,并对他进行赋值
stu.setName( studentNames[i] );
stu.setStuNum(i);
stu.setOtherInfo("我是班里帅哥榜排第" + ( i + 1 ) + "的人");
flag.setData(stu);//将已经赋值完成的学生对象添加到新定义的数据节点猴中
que.add(flag);//qeu指向此节点,将此节点链接到栈结构中
if( i == 3 || i == 6 || i == 9 ){//为体验栈结构“后进先出”的感念,将第3,6,9个元素入栈后直接出栈
NodeClass<Student> as = que.pop();
if( as == null ){//判断此时元素是不是为空,为空即输出“空”
System.out.println("空了");
break;
}else{
System.out.println(as.getData().getName());
}
}
}
for(;;){//循环输出,遍历整个栈
NodeClass<Student> as = que.pop();
if( as == null ){
System.out.println("空了");
break;
}else{
System.out.println(as.getData().getName());
}
}
}
}
5、测试类实现队列
package Stack;
import que.QueClass;
/**
* Created by Administrator on 2019/9/21.
*/
public class TestClass2 {
public static void main(String[] args) {
//建立一个队列结构对象
QueClass<Student> que=new QueClass<Student>();
// QueClass<Student> end=new QueClass<Student>();//尾指针
String[] name=new String[]{
"qinshuaihang","zhongjainjun","liyuhang","daishubo ","zhaohengfei","yangjianxing","jinxu","liweichen"
};
//入队
for (int i=0;i<name.length;i++){
NodeClass<Student> flag=new NodeClass<>();
Student stu=new Student();
stu.setName(name[i]);
stu.setStuNum(i+1);
stu.setOtherInfo("我是第"+(i+1)+"个入队的");
//将学生放进去节点
flag.setData(stu);
que.add(flag);//将节点加入队列
}
//出队
while (true){
if (que.getQue()==null){
break;
}else{
NodeClass<Student> result = que.pop();
// System.out.println(result.getData().getName());
System.out.println("出队"+ result.getData().toString());
}
}
}
}
6、补充
a、判断栈是否为空,可以在定义站结构时给头指针一个初始值-1.来进行判断
判断队列是否为空,可以用头指针和尾指针是否相等来进行判断