基本数据结构,循环队列的顺序实现。

队列是一种先进先出的数据结构,这里用顺序结构将其实现。

1.首先用结构体定义一个队列,front指向队首元素的前面一位,real指向队尾元素。

1 //队列的结构定义
2 #define MAX 6
3 typedef struct {
4     int front,real;
5     int data[MAX];
6 }queue;

2.创建一个循环队列,初始化令front=real=0,因为当队列满时也有front=real,此时无法判断队满;所以我们弃置一个元素位不用,其位置随机,所以队列的实际最大容量为MAX-1。

1 //队列的初始化
2 void InitQueue(queue *s)
3 {
4     s->front=s->real=0; 
5 }

2.入队操作,首先判断队列是否满,此时可能有两种情况:一种是队尾指针到达队首指针的前面一个位置,此时判断条件是  s->real+1==s->front;另一种情况是队尾指针到达该队列的最后一个位置,此时就不能用s->real+1==s->front来判断了,这时可以通过(s->real+1)%MAX==s->front来判断是否队满。若队列不满,则指针下移,下移思路和判断队满一样,移动条件为s->real = (s->real+1)%(MAX),同时给队尾元素赋值

1 //入队
2 void EnQueue(queue *s,int e){
3     if((s->real+1)%MAX==s->front){
4         printf("队列上溢
");
5         return ;
6     }
7     s->real = (s->real+1)%(MAX);    
8     s->data[s->real] = e;
9 } 

 3.判断队空

1 //队列空返回1,不为空返回0。
2 int EmptyQueue(queue *s){
3     if(s->front==s->real){
4         return 1;
5     }
6     return 0;
7 } 

4.出队操作,如果队列下溢,则函数返回;否则将队首指针后移一位,下移思路和上面一致,都是通过取模运算实现。

1 void DeQueue(queue *s){
2     if(EmptyQueue(s)){
3         printf("队列下溢
");
4         return ;
5     }
6     s->front=(s->front+1)%MAX;
7 } 

链表实现先进先出队列

public class Queue<Item> {

    private Node first;    //队头节点
    private Node last;    //队尾节点
    private int N;  //元素个数
    //节点定义
    private class Node{
        Item item;
        Node next;
    }
    
    public boolean isEmpty(){ return first == null; }
    
    public int size(){ return N;}
    
    //入队操作
    public void enqueue( Item item){
        Node oldlast = last;
        last = new Node();
        last.item = item;
        last.next = null;
        if(isEmpty()) first = last;
        else oldlast.next = last;
        N++;
    }
    
    //出队操作
    public Item dequeue(){
        Item item = first.item;
        first = first.next;
        if(isEmpty()) last = null;
        N--;
        return item;
    }
    

}
View Code
原文地址:https://www.cnblogs.com/tanxing/p/4921970.html