12. C Pro Queue VS Stack 简单用例
一、队列:先进先出,模拟银行叫号系统
#include
#define MAXQ 15
typedef struct {
int num;
long time;
}DATA;
typedef struct {
DATA data[MAXQ];
int head;
int tail;
}CycQueue;
CycQueue *InitQueue() { // 初始化
CycQueue *q;
if (q = (CycQueue*)malloc(sizeof(CycQueue))) {
q->head = 0;
q->tail = 0;
return q;
}
return NULL;
}
void FreeQueue(CycQueue* q) { // 释放队列
if (q) free(q);
}
int IsEmptyQueue(CycQueue* q) { // 是否为空
return (q->head == q->tail);
}
int IsFullQueue(CycQueue* q) { // 是否队满
return ((q->tail + 1) % MAXQ == q->head);
}
int QueueIn(CycQueue *q, DATA data) { // 只能由队尾入队
if (IsFullQueue(q)) return 0;
q->data[q->tail] = data;
q->tail++;
return 1;
}
DATA* QueueOut(CycQueue* q) { // 只能由队首出队
if (IsEmptyQueue(q)) return 0;
DATA* d;
d = &q->data[q->head];
q->head++;
return d;
}
int QueueLen(CycQueue* q) {
if (IsEmptyQueue(q)) return 0;
return (q->tail - q->head);
}
DATA* QueuePeek(CycQueue* q) {
if (IsEmptyQueue(q)) return NULL;
return &(q->data[q->head]);
}
int num=0;
void add(CycQueue* q) {
DATA data;
if (!IsFullQueue(q)) {
data.num = ++num;
data.time = time(NULL);
QueueIn(q, data);
}
else
printf("\n排队人数过多,请稍后!\n");
}
void next(CycQueue* q) {
DATA *data;
if (!IsEmptyQueue(q)) {
data = QueueOut(q);
printf("\n欢迎%d号顾客到前台办理业务!\n", data->num);
}
if (!IsEmptyQueue(q)) {
data = QueuePeek(q);
printf("\n请%d号顾客做好准备,即将为您办理业务!\n",data->num);
}
else
printf("\n队列已空,完成当前作业之后,即可下班!\n");
}
int main() {
CycQueue *queue;
char select=' ';
queue = InitQueue();
if (queue==NULL) {
printf("创建队列出错\n");
exit(0);
}
while (select != '0') {
printf("\n请选择具体操作:\n");
printf("1.新到顾客\n");
printf("2.下一个顾客\n");
printf("0.退出\n");
scanf(" %c", &select);
switch (int(select)) {
case 1:
add(queue);
printf("\n现在共有%d位顾客在等候!\n", QueueLen(queue));
break;
case 2:
next(queue);
printf("\n现在共有%d位顾客在等候!\n", QueueLen(queue));
break;
case 0:
break;
}
}
FreeQueue(queue);
getchar(); return 0;
}
二、栈:后进先出
#include
#include
#include
/* 请注意:
1.栈起点为0;
2.s->top 总是指向实际top元素的下一跳,无具体数据存储
3.由2推理,s->top == SIZE 时,栈已满;s->top ==0 时,空栈
4.s->top 本身指向的数据是不确定的!
s->top 在 ++/ -- 之前,一定要想好!
*/
#define SIZE 3
typedef struct {
int age;
char name[10];
}PeoP;
typedef struct {
PeoP data[SIZE];
int top;
}Stack;
Stack* StackInit() {
Stack* s;
if (s = (Stack*)malloc(SIZE * sizeof(Stack))) {
s->top = 0;
memset(s->data, 0, SIZE*sizeof(PeoP));
return s;
}
return NULL;
}
void StackFree(Stack *s) {
if (s)
free(s);
}
int StackIsEmpty(Stack *s) {
return (s->top == 0);
}
void StackClear(Stack *s) {
s->top = 0;
}
int StackIsFull(Stack* s) {
return (s->top == SIZE);
}
void PrintStack(Stack* s) {
int t=s->top;
if (s->top == 0)
{
printf("Stack is Empty!\n");
exit(0);
}
printf("\nPrint Stack Elems\n");
while (t >0) {
t--;
printf("%d:\t%s %d\n", t, s->data[t].name, s->data[t].age);
}
}
int StackPush(Stack* s,PeoP* pp) { // 入栈
if (StackIsFull(s)) {
printf("Stack is Full.\n");
return 0;
}
s->data[s->top++] = *pp;
return 1;
}
PeoP* StackPop(Stack *s) { // 出栈
if (StackIsEmpty(s)) {
printf("Stack is Empty.\n");
return NULL;
}
return &(s->data[--s->top]);
}
int main() {
PeoP *p=(PeoP*)malloc(sizeof(PeoP*)), *q;
memset(p, 0, sizeof(PeoP*));
Stack* s = StackInit();
char flag;
while(true){
printf("请选择执行的操作:\n");
printf("1.入栈\t 2.出栈\t 0.退出\n");
scanf(" %c", &flag);
if (flag == '1') {
printf("请输入姓名和年龄,执行入栈操作:");
scanf("%s", (*p).name);
scanf("%d", &(*p).age);
if (StackPush(s, p) == 1)
{
printf("入栈成功,请继续其他操作\n");
PrintStack(s);
}
else
printf("栈已满,请先执行其他操作\n\n");
}
if (flag == '2') {
printf("执行出栈操作:\n");
q = StackPop(s);
if (q != NULL)
printf("出栈数据为:%s\t%d\n", q->name, q->age);
else
printf("栈已空,请先执行其他操作\n\n");
}
if (flag == '0')
break;
}
StackFree(s);
getchar(); return 0;
}