C/Data Structure Algorithm/Queue

Материал из C\C++ эксперт
Перейти к: навигация, поиск

A circular queue example using a keyboard buffer

/*
C: The Complete Reference, 4th Ed. (Paperback)
by Herbert Schildt
ISBN: 0072121246
Publisher: McGraw-Hill Osborne Media; 4 edition (April 26, 2000)
*/
/* A circular queue example using a keyboard buffer. */
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#define MAX 80
char buf[MAX+1];
int spos = 0;
int rpos = 0;
void qstore(char q);
char qretrieve(void);
int main(void)
{
  register char ch;
  int t;
  buf[80] = "\0";
  /* Input characters until a carriage return is typed. */
  for(ch=" ",t=0; t<32000 && ch!="\r"; ++t) {
    if(_kbhit()) {
      ch = _getch();
      qstore(ch);
    }
    printf("%d ", t);
    if(ch == "\r") {
      /* Display and empty the key buffer. */
      printf("\n");
      while((ch=qretrieve()) != "\0") printf("%c", ch);
      printf("\n");
    }
  }
  return 0;
}
/* Store characters in the queue. */
void qstore(char q)
{
  if(spos+1==rpos || (spos+1==MAX && !rpos)) {
    printf("List Full\n");
    return;
  }
  buf[spos] = q;
  spos++;
  if(spos==MAX) spos = 0; /* loop back */
}
/* Retrieve a character. */
char qretrieve(void)
{
  if(rpos==MAX) rpos = 0; /* loop back */
  if(rpos==spos) return "\0";
  rpos++;
  return buf[rpos-1];
}


Queue in C

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <ctype.h>
#define MAX 100
char *p[MAX], *pop(void);
int spos = 0;
int rpos = 0;
void add(void), push(char *q), print(void), remove(void);

void add(void)
{
  char s[256], *p;
  do {
    printf("spos %d: ", spos+1);
    gets(s);
    if(*s==0) {
       break;
    }
    p = (char *) malloc(strlen(s)+1);
    if(!p) {
      printf("Out of memory.\n");
      return;
    }
    strcpy(p, s);
    if(*s) {
       push(p);
    }
  } while(*s);
}
void print(void)
{
  int t;
  for(t=rpos; t < spos; ++t)
    printf("%d. %s\n", t+1, p[t]);
}
void remove(void)
{
  char *p;
  if((p=pop())==NULL) {
     return;
  }
  printf("%s\n", p);
}
void push(char *q)
{
  if(spos==MAX) {
    printf("List Full\n");
    return;
  }
  p[spos] = q;
  spos++;
}
char *pop(void)
{
  if(rpos==spos) {
    printf("No more.\n");
    return NULL;
  }
  rpos++;
  return p[rpos-1];
}
int main(void)
{
  char s[80];
  register int t;
  for(t=0; t < MAX; ++t) {
     p[t] = NULL;
  }
  while(1) {
    printf("Add(A), Print(P), Remove(R), Quit(Q): ");
    gets(s);
    *s = toupper(*s);
    switch(*s) {
      case "A":
        add();
        break;
      case "P":
        print();
        break;
      case "R":
        remove();
        break;
      case "Q":
        exit(0);
    }
  }
  return 0;
}