栈和队列结构的实现可以用数组和链表均可,但相较而言数组实现不够灵活,缺点明显,所以一般推荐用链表来实现,比较简单,大家应该直接看代码就明白了,主要记住这两种数据结构的特性 栈是先进后出,队列是先进先出。
1、定义一个结点类
public class ListNode<T> {
T data;
ListNode<T> next;
}
2、实现栈类
package com.shengxue.demo1;
/**
* 用链表实现一个栈结构
*/
public class ListNodeStack<T> {
private ListNode<T> pHead;
public ListNodeStack(ListNode<T> pHead) {
this.pHead = pHead;
}
public ListNodeStack() {
pHead = new ListNode<T>();
pHead.data = null;
pHead.next = null;
}
//判断栈是否为空
boolean isEmpty(){
return pHead == null;
}
//获取栈中元素的个数
int size(){
int size = 0;
ListNode<T> next = pHead.next;
while(next != null){
next= next.next;
size++;
}
return size;
}
//压栈
void push(T e){
ListNode<T> p = new ListNode<>();
p.data = e;
p.next = pHead.next;
pHead.next = p;
}
//出栈,返回栈顶元素
T pop(){
ListNode<T> tmp = pHead.next;
if(tmp != null){
pHead.next = tmp.next;
return tmp.data;
}
System.out.println("栈已为空");
return null;
}
//取得栈顶元素
T top(){
if(pHead.next != null){
return pHead.next.data;
}
System.out.println("栈已为空");
return null;
}
public static void main(String[] args) {
ListNodeStack<Integer> stack = new ListNodeStack<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println("栈顶元素:"+stack.top());
System.out.println("栈大小为:"+stack.size());
stack.pop();
System.out.println("出栈一个");
System.out.println("栈顶元素:"+stack.top());
System.out.println("栈大小为:"+stack.size());
}
}
3、实现队列
package com.shengxue.demo1;
/**
* 链表实现队列
*/
public class MyQueue<T> {
//队列首元素
private ListNode<T> pHead;
//队列尾元素
private ListNode<T> pEnd;
//分配头结点
public MyQueue(){
pEnd = pHead = null;
}
//判断队列是否为空
boolean isEmpty(){
if(pHead == null){
return true;
}else {
return false;
}
}
//获取栈中元素个数
int size(){
int size = 0;
ListNode<T> p = pHead;
while(p != null){
p = p.next;
size++;
}
return size;
}
//入队列
void inQueue(T e){
ListNode<T> p = new ListNode<>();
p.data = e;
p.next = null;
if(pHead == null){
pHead = pEnd = p;
}else {
pEnd.next = p;
pEnd = p;
}
}
//出队列
void outQueue(){
if(pHead == null){
return;
}
pHead = pHead.next;
if(pHead == null){
pEnd = null;
}
}
//取得队列首元素
T getFront(){
if(pHead == null){
System.out.println("该队列为空");
return null;
}
return pHead.data;
}
//取得队尾元素
T getLast(){
if(pEnd == null){
System.out.println("该队列为空");
return null;
}
return pEnd.data;
}
public static void main(String[] args) {
MyQueue<Integer> queue = new MyQueue<>();
queue.inQueue(1);
queue.inQueue(2);
queue.inQueue(3);
System.out.println("队列大小:"+queue.size());
System.out.println("队列头元素:"+queue.getFront());
System.out.println("队列尾元素:"+queue.getLast());
queue.outQueue();
System.out.println("队列大小:"+queue.size());
System.out.println("队列头元素:"+queue.getFront());
System.out.println("队列尾元素:"+queue.getLast());
}
}