数据结构——顺序队列(sequence queue)

/* sequenceQueue.c */
/* 顺序队列 */

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

#define MAXSIZE 100

/* 顺序循环队列数据结构 */
/* 一个圆圈,front指向队列头,rear指向队列尾 */
/* 
    front     ->       ...         -> rear
    data[0] ->    data[...]    -> data[n]
*/
typedef struct {
    int data[MAXSIZE];
    int rear, front;
    int num;              /* 队列元素的个数 */
} SeqQueue;

void interface(void);
/* 顺序列表函数声明 */
SeqQueue *initializeSeqQueue();
bool isFullSeqQueue(SeqQueue*);
bool isEmptySeqQueue(SeqQueue*);
void inSeqQueue(SeqQueue*, int);
int outSeqQueue(SeqQueue*);

int main(){
    SeqQueue *sq = initializeSeqQueue();
    int flag, number;

    interface();
    for(;;){
        printf("Command: ");
        scanf("%d", &flag);
        switch(flag){
            case 0: printf("Bye!\n"); return 0; break;
            case 1:
                if(isFullSeqQueue(sq))
                    printf("Queue is full!\n");
                else{
                    printf("Enter number: ");
                    scanf("%d", &number);
                    inSeqQueue(sq, number);
                }
                break;
            case 2:
                if(isEmptySeqQueue(sq))
                    printf("Queue is empty!\n");
                else{
                    printf("value: %d\n", outSeqQueue(sq));
                }
                break;
        }
    }

    return 0;
}

void interface(void){
    puts("+********************+");
    puts("+  0, quit  退出     +");
    puts("+  1, in    入队     +");
    puts("+  2, out   出队     +");
    puts("+********************+");
}
/* 顺序列表函数实现 */
/* 初始化顺序列表,列表为空,front和read都为-1,num为0 */
SeqQueue *initializeSeqQueue(){
    SeqQueue *sq = (SeqQueue*)malloc(sizeof(SeqQueue));
    sq->front = sq->rear = -1;
    sq->num = 0;
    return sq;
}
/* 判断队列是否为空 */
bool isEmptySeqQueue(SeqQueue *sq){
    if(sq->num==0)
        return true;
    return false;
}
/* 判断队列是否已满 */
bool isFullSeqQueue(SeqQueue *sq){
    if(sq->num==MAXSIZE)
        return true;
    return false;
}
/* 入队 */
void inSeqQueue(SeqQueue *sq, int number){
    /* 循环队列,取余MAXSIZE */
    sq->rear = sq->rear+1 % MAXSIZE;
    sq->data[sq->rear] = number;
    sq->num++;
}
/* 出队 */
int outSeqQueue(SeqQueue *sq){
    sq->front = sq->front+1 % MAXSIZE;
    sq->num--;
    return sq->data[sq->front];
}

 

上一篇:Flex 布局知识点梳理


下一篇:王道数据结构:顺序表上基本操作的实现