栈与队列基本操作 Java实现

一、顺序栈

//数组实现顺序栈
public class OrderStack {
    private String[] elem;
    private int top;
    OrderStack(int k) {
        elem = new String[k];
        top = -1;
    }
    //判满
    boolean isFull() {
        return top == (elem.length - 1);
    }
    //判空
    boolean isEmpty() {
        return top == -1;
    }
    //进栈
    boolean push(String s) {
        if(isFull()) {
            return false;
        }
        elem[++top] = s;
        return true;
    }
    //出栈
    String pop() {
        if(isEmpty()) {
            System.out.println("Empty stack");
            return null;
        }else {
            return elem[top--];
        }
    }
    //获取栈顶元素
    String getTop() {
        if(isEmpty()) {
            System.out.println("Empty stack");
            return null;
        }else {
            return elem[top];
        }
    }
    
}

 二、链栈

存储结构

public class LinkNode {
    int i;
    LinkNode next;
    LinkNode(int i) {
        this.i = i;
    }
    public String toString() {
        return String.valueOf(i);
    }
}

 链栈实现

//链表存储实现
public class LinkStack {
    private LinkNode top;
    LinkStack() {
        top = new LinkNode(-1);
    }
    boolean isEmpty() {
        return top.next ==null;
    }
    //头插法方便出栈
    LinkNode push(LinkNode temp) {
        if(temp == null) {
            System.out.println("null pointer");
        }
        temp.next = top.next;
        top.next = temp;
        return temp;
    }
    LinkNode pop() {
        LinkNode temp = null;
        if(isEmpty()) {
            System.out.println("empty");
            return null;
        }
        temp = top.next;
        top.next = temp.next;
        return temp;
    }
    LinkNode getTop() {
        return top.next;
    }
}

 三、队列

存储结构

public class LinkNode {
    int i;
    LinkNode next;
    LinkNode(int i) {
        this.i = i;
    }
    public String toString() {
        return String.valueOf(i);
    }
}

 链队列

public class MyQueue {
    private LinkNode front;
    private LinkNode rear;
    MyQueue() {
        front = new LinkNode(-1);
        rear = front;
    }
    boolean isEmpty() {
        return front == rear;
    }
    LinkNode enterQueue(LinkNode temp) {
        rear.next = temp;
        rear = temp;
        return temp;
    }
    LinkNode deleteQueue() {
        if(isEmpty()) {
            System.out.println("Empty");
        }
        LinkNode temp = front.next;
        if(front.next == rear) {
            front.next = rear.next;
            rear = front;
        }
        front.next = temp.next;
        temp.next = null;
        return temp;
    }
}

 循环队列

//数组实现的循环队列
//采用不损失空间的方式实现
public class CirQueue {
    private String[] elem;
    private int front;
    private int rear;
    //入队flag赋1值,出队flag赋0值
    private int flag = 0;
    CirQueue(int k) {
        elem = new String[k];
        front = 0;
        rear = 0;
    }
    boolean isFull() {
        return flag == 1 && rear == front;
    }
    boolean isEmpty() {
        return flag == 0 && rear == front;
    }
    String enter(String temp) {
        if(isFull()) {
            System.out.println("Full");
        }else {
            elem[rear] = temp;
            rear = (rear + 1) % elem.length;
            flag = 1;
        }
        return temp;
    }
    String delete() {
        String temp = null;
        if(isEmpty()) {
            System.out.println("Empty");
        }else {
            temp = elem[front];
            front = (front + 1)%elem.length;
            flag = 0;
        }
        return temp;
    }
}

 这里使用了一个编程的小技巧,将操作打上了记号。

posted @ 2019-10-13 19:34  卑微芒果  Views(650)  Comments(0Edit  收藏  举报