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;
}

相关