堆栈和队列的java实现,努力秋招的第一天

堆栈和队列的结构

堆栈(Stack):后进先出(LIFO-last in first out):最后插入的元素最先出来。

队列(Queue):先进先出(FIFO-first in first out):最先插入的元素最先出来。

图来自网络其他博主(借鉴参考)

堆栈和队列可以由很多种方式实现,例如用数组实现堆栈,链表实现堆栈,数组实现队列,链表实现队列等,下面依次写出四种实现方式。

1.数组实现堆栈

import java.util.Scanner;
public class Stack {
	private int []arr=new int [10];
    private int stackTop=0;
    public void push(int data) {
    if(stackTop<arr.length) {
 	   arr[stackTop++]=data;
    }else
    {
System.out.println("栈满了.");
    }
    
}
    public int pop() {
 	   if(stackTop>0) {
 		   
 		   return arr[--stackTop];
 		   
 	   }
 	   else System.out.println("栈空");
 		   return -1;
    }

}

public class Main {
    

	public static void main(String[] args) {
        Stack a=new Stack();
        a.push(52);
        a.push(5);
        a.push(52);
        a.push(52);
        a.push(52);
        a.push(52);
        a.push(1584);
        a.push(7841);
        a.push(48);
        a.push(552);
       int x;
       while((x=a.pop())!=-1) {
    	   System.out.println(x);
       }
}
	}

结果

2.链表实现堆栈

public class Node {
	 Node next;	
	 int data;
}
public class StackNodeTest {
	Node root;//头节点
	Node tail;//尾节点
	public void push(int data) {
		if(root==null) {
			root=new Node();
			root.data=data;
			tail=root;
			
		}else {
			
			//创建一个新结点存进栈数据
			Node a=new Node();
			a.data=data;			
			tail.next=a;
			tail=a;
		}
		
	}
	public int pop() {
		//无头结点
		if(tail==null) {
			System.out.println("栈中无数据哦");
			return -Integer.MAX_VALUE;
		}
		//只有头节点
		if(tail==root) {
			int data=tail.data;
			root=null;
			tail=null;
			return data;
		}
		//创建新节点遍历出需要出栈节点的上一个节点
		int data=tail.data;
		Node t=root;
		while(t.next.next!=null) {
			t=t.next;
			
		}
		//尾节点指向上一节点
		tail=t;
		tail.next=null;
		return data;	
	}
	public static void main (String [] args) {
		StackNodeTest a=new StackNodeTest();
		a.push(221);
		a.push(1233333);
		a.push(1233333);
		System.out.println(a.pop());
		System.out.println(a.pop());
		System.out.println(a.pop());
		System.out.println(a.pop());
		a.push(221);
		a.push(1233333);
		System.out.println(a.pop());
		a.push(234441);
		System.out.println(a.pop());
		System.out.println(a.pop());
		System.out.println(a.pop());
	}
 

}

结果

3.数组实现队列

注意,利用循环数组实现队列时,牺牲一个数组单元以区分队满还是队空

package lianxi;


	import java.io.*;
    public class QueueArray {   
    String[] a; //对象数组,只能存length-1个对象   
    int front;  //队首下标   
    int rear;   //队尾下标   
   
    public QueueArray(int size){   
        a = new String[size];   
        front = 0;   
        rear =0;   
    }   
    /**  
     * 将一个对象追加到队列尾部  
     * @param obj 对象  
     * @return 队列满时返回false,否则返回true  
     */  
    public boolean in(String obj){   
        if((rear+1)%a.length==front){   
            return false;   
        }   
        a[rear]= obj;   
        rear = (rear+1)%a.length;   
        return true;   
    }   
    /**  
     * 队列头部的第一个对象出队  
     * @return 出队的对象,队列空时返回null  
     */  
    public String out(){   
        if(rear==front){   
            return null;   
        }   
        String obj = a[front];   
        front = (front+1)%a.length;   
        return obj;   
    }   
    public static void main(String[] args) {   
        QueueArray q = new QueueArray(4);   
        System.out.println(q.in("aa"));   
        System.out.println(q.in("bb"));   
        System.out.println(q.in("cc"));   
        System.out.println(q.in("dd"));//无法入队列,队列满   
        for(int i=0;i<4;i++){   
            System.out.println(q.out());   
        }   
    }   
}

结果

4.数组实现堆栈

package lianxi;

public class Stack1 {

	// 堆栈容量
	private int max;
	// top表示栈顶
	private int top = -1;
	// 数组
	int[] Stack;

	// 创建数组
	public void arrayStack(int max) {
		this.max = max;
		Stack = new int[this.max];
	}

	// 判断堆栈是否已满
	public boolean isFull() {
		return top == max - 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() {
		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.println( Stack[i]);
		}
	}

	public static void main(String[] args) {
		
		Stack1 Stack = new Stack1();
		//进栈
		Stack.arrayStack(5);
		Stack.push(3);
		Stack.push(4);
		Stack.push(5);
		Stack.push(6);
		Stack.show();
		//出栈
		System.out.println("输出的数据为:"+Stack.pop());
		Stack.show();

	}
}

结果:

Supongo que te gusta

Origin blog.csdn.net/weixin_44927247/article/details/116499007
Recomendado
Clasificación