数据结构完结了栈和队列的内容
对集合框架中的接口有了更深的认识,并且自主实现了栈和队列,发现了双向链表的强大性,可以用来作为栈和队列处理很多问题。
数组实现栈
import java.util.Arrays;
//实现栈
public class MyStack {
public int[] elem;
public int usedSize;
public static final int DEFAULT_CAPACITY = 5;
public MyStack(){
elem = new int[DEFAULT_CAPACITY];
}
public void push(int e){
if(usedSize == elem.length){
elem = Arrays.copyOf(elem,elem.length*2);
}
elem[usedSize] = e;
usedSize++;
}
public int pop(){
if(empty()){
return -1;
}
int val = elem[usedSize-1];
elem[usedSize] = 0;
usedSize--;
return val;
}
public int peek(){
if(empty()){
return -1;
}
return elem[usedSize-1];
}
public int size(){
return usedSize;
}
public boolean empty(){
return usedSize == 0;
}
}
链表实现队列
public class MyQueue {
static class ListNode{
public ListNode prev;
public ListNode next;
int val;
ListNode(int val){
this.val = val;
}
}
public ListNode head;
public ListNode last;
//尾插
public void offer(int value){
ListNode node = new ListNode(value);
if(isEmpty()){
this.head = node;
this.last = node;
}else {
last.next = node;
node.prev = last;
last = node;
}
}
private boolean isEmpty() {
if(this.head == null){
return true;
}
return false;
}
//头删
public int poll(){
if(head == null){
return -1;
}
int val = head.val;
if(head == last){
head = null;
last = null;
}else {
head = head.next;
head.prev = null;
}
return val;
}
public int peek(){
if(head == null){
return -1;
}
return this.head.val;
}
public int size(){
ListNode cur = head;
int count = 0;
while(cur != null){
count++;
cur = cur.next;
}
return count;
}
public boolean empty(){
if(head == null){
return true;
}
return false;
}
}
用栈实现队列
import java.util.LinkedList;
import java.util.Stack;
//用栈实现队列
public class MyQueue {
public Stack<Integer> stack1;
public Stack<Integer> stack2;
public MyQueue() {
stack1 = new Stack<>();
stack2 = new Stack<>();
}
// void push(int x) 将元素 x 推到队列的末尾
public void push(int x) {
stack1.push(x);
}
// int pop() 从队列的开头移除并返回元素
public int pop() {
if(empty()){
return -1;
}
if(stack2.empty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.pop();
}
// int peek() 返回队列开头的元素
public int peek() {
if(empty()){
return -1;
}
if(stack2.empty()){
while(!stack1.isEmpty()){
stack2.push(stack1.pop());
}
}
return stack2.peek();
}
// boolean empty() 如果队列为空,返回 true ;否则,返回 false
public boolean empty() {
return stack1.isEmpty() && stack2.isEmpty();
}
}
用队列实现栈
import java.util.LinkedList;
import java.util.Queue;
//用队列实现栈
public class MyStack {
public Queue<Integer> queue1;
public Queue<Integer> queue2;
public MyStack() {
queue1 = new LinkedList<>();
queue2 = new LinkedList<>();
}
public void push(int x) {
if(!queue1.isEmpty()){
queue1.offer(x);
}else if(!queue2.isEmpty()){
queue2.offer(x);
}else {
queue1.offer(x);
}
}
public int pop() {
if(empty()){
return -1;
}
if(!queue1.isEmpty()){
int size = queue1.size();
while(size-1 != 0){
queue2.offer(queue1.poll());
size--;
}
return queue1.poll();
}else {
int size = queue2.size();
while(size-1 != 0){
queue1.offer(queue2.poll());
size--;
}
return queue2.poll();
}
}
public int top() {
if(empty()){
return -1;
}
if(!queue1.isEmpty()){
int size = queue1.size();
int val = -1;
while(size != 0){
val = queue1.poll();
queue2.offer(val);
size--;
}
return val;
}else {
int size = queue2.size();
int val = -1;
while(size != 0){
val = queue2.poll();
queue2.offer(val);
size--;
}
return val;
}
}
public boolean empty() {
return queue1.isEmpty() && queue2.isEmpty();
}
}
浙公网安备 33010602011771号