#include <stdio.h> #define SIZE sizeof(SEQQUEUE) #define MAXSIZE 5 #define PRINT_ITEM "%d " #define SCANF_ITEM "%d" typedef int bool; //定义bool类型
const bool true = 1; const bool false = 0; typedef int ELEMTYPE; //元素类型
const ELEMTYPE QUEUE_NULL = -9999; //定义当队列为空,返回的值
typedef struct //定义顺序队列
{ ELEMTYPE data[MAXSIZE]; int front; //队头指针
int rear; //队尾指针
}SEQQUEUE;
SEQQUEUE * INITQUEUE();//初始化空队列
bool EMPTY(SEQQUEUE *);//判断队列是否为空
bool FULL(SEQQUEUE *);//判断队列是否已满
bool ADDQUEUE(SEQQUEUE *,ELEMTYPE);//进行元素入队操作,true:入队成功;false: 队列已满,不能入队
ELEMTYPE DELQUEUE(SEQQUEUE *);//从队头删除一个元素,返回队头元素值;如果队列为空,则返回QUEUE_NULL
ELEMTYPE GET_FRONT(SEQQUEUE *);//获取队列头的元素值,如果队列为空,返回QUEUE_NULL
ELEMTYPE GET_REAR(SEQQUEUE *);//获取队尾元素值,如果队列元素为空,返回QUEUE_NULL
bool CLEAR(SEQQUEUE *);//清空队列;true:操作成功;false:队列为空
int CURRENT_SIZE(SEQQUEUE *);//求队列中的元素的个数的函数
void menu();//定义菜单
void print_tab(); //打印tab键
void print_enter(); //打印回车
void print_str(char *); //打印字符串
void print_info(char *); //打印信息
void print_menu_item(char *,char *); //打印菜单每一项
void queue_add(SEQQUEUE *);//入队
void queue_del(SEQQUEUE *);//出队
void queue_empty(SEQQUEUE *);//是否空队
void queue_get_front(SEQQUEUE *);//获取队头元素
void queue_clear(SEQQUEUE *);//清空队列
void queue_count(SEQQUEUE *);//队列元素个数
void queue_method(SEQQUEUE *,void (* fun)(SEQQUEUE *));//定义函数指针
int get_item();//获取选项的值
ELEMTYPE get_input();//获取输入的元素值。
void print_queue_full();//打印队列满的信息。
void print_queue_null();//队列是null
int main(int argc,char *aggv[]) { SEQQUEUE * queue = INITQUEUE(); menu(); int item_value = 0; do { item_value = get_item(); switch(item_value) { case -1: break; case 0: menu(); break; case 1: queue_method(queue,queue_add); break; case 2: queue_method(queue,queue_del); break; case 3: queue_method(queue,queue_empty); break; case 4: queue_method(queue,queue_get_front); break; case 5: queue_method(queue,queue_clear); break; case 6: queue_method(queue,queue_count); break; default: menu(); break; } }while (item_value != -1); return 0; }
SEQQUEUE * INITQUEUE() { SEQQUEUE * queue = malloc(SIZE); queue->front = 0; queue->rear = 0; }
bool EMPTY(SEQQUEUE * queue) { bool result; if (queue->front == queue->rear) { result = true; } else { result = false; } return result; }
bool FULL(SEQQUEUE * queue) { bool result; if (queue->front == (queue->rear + 1) % MAXSIZE) { result = true; } else { result = false; } }
bool ADDQUEUE(SEQQUEUE * queue,ELEMTYPE data) { bool result; if (FULL(queue)) { result = false; } else { queue->rear = (queue->rear + 1) % MAXSIZE; //指向下一个单元
queue->data[queue->rear] = data; result = true; } return result; }
ELEMTYPE DELQUEUE(SEQQUEUE * queue) { ELEMTYPE result = QUEUE_NULL; if (! EMPTY(queue)) { queue->front = (queue->front + 1) % MAXSIZE; result = queue->data[queue->front]; } return result; }
ELEMTYPE GET_FRONT(SEQQUEUE * queue) { ELEMTYPE result = QUEUE_NULL; if (! EMPTY(queue)) { int index = (queue->front + 1) % MAXSIZE; result = queue->data[index]; } return result; }
ELEMTYPE GET_REAR(SEQQUEUE * queue) { ELEMTYPE result = QUEUE_NULL; if (! EMPTY(queue)) { result = queue->data[queue->rear]; } return result; }
bool CLEAR(SEQQUEUE * queue) { bool result = false; if(! EMPTY(queue)) { queue->front = 0; queue->rear = 0; result = true; } return result; }
int CURRENT_SIZE(SEQQUEUE * queue) { int result; if (queue->front == queue->rear) { result = 0; } else if (queue->rear > queue->front) { result = queue->rear - queue->front; } else { result = queue->rear + MAXSIZE - queue->front; } return result; }
void menu() { print_enter(); print_tab();print_info("sequeue queue manage system");print_enter(); print_menu_item("1","add element into queue"); print_menu_item("2","delete a element from front"); print_menu_item("3","judge queue is empty"); print_menu_item("4","get front element value"); print_menu_item("5","clear queue"); print_menu_item("6","get queue element count"); print_menu_item("0","return menu"); print_menu_item("-1","exit system"); }
void print_tab() { printf("\t"); }
void print_enter() { printf("\n"); }
void print_str(char * ch) { while(*ch) { printf("%c",*ch++); } }
void print_info(char * info) { print_tab(); print_str(info); print_enter(); } void print_menu_item(char * item,char * desc) { print_tab(); print_str(item); print_tab(); print_str(desc); print_enter(); }
ELEMTYPE get_input() { ELEMTYPE result; print_tab(); printf("please input :"); scanf(SCANF_ITEM,&result); return result; } int get_item() { int result; print_tab(); printf("select menu :"); scanf("%d",&result); return result; }
void print_queue_full() { print_info("error:queue is full."); }
void print_queue_null() { print_info("error:queue is null."); }
void queue_add(SEQQUEUE * queue) { ELEMTYPE data = get_input(); bool result = ADDQUEUE(queue,data); if(result) { print_info("add element success."); } else { print_queue_full(); } }
void queue_del(SEQQUEUE * queue) { ELEMTYPE result = DELQUEUE(queue); if (result != QUEUE_NULL) { print_info("del head queue is success."); } else { print_queue_null(); } }
void queue_empty(SEQQUEUE * queue) { bool result = EMPTY(queue); if (result) { print_info("queue is empty."); } else { print_info("queue is not empty."); } } void queue_get_front(SEQQUEUE * queue) { ELEMTYPE result = GET_FRONT(queue); if (result == QUEUE_NULL) { print_info("error:queue is null."); } else { print_tab(); printf("the queue front element is : "); printf(PRINT_ITEM,result); print_enter(); } }
void queue_clear(SEQQUEUE * queue) { bool result = CLEAR(queue); if (result) { print_info("queue clear is success."); } else { print_info("queue is empty"); } } void queue_count(SEQQUEUE * queue) { int count = CURRENT_SIZE(queue); print_tab(); printf("the element count is : %d",count); print_enter(); } void queue_method(SEQQUEUE * queue,void (* fun)(SEQQUEUE * src_queue)) { (* fun)(queue); }
|