链队列代码及应用

Posted Dëm0n

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链队列代码及应用相关的知识,希望对你有一定的参考价值。

链队列代码

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <time.h>

#define OK 1
#define ERROR 0
#define OVERFLOW -2
#define TRUE 1
#define FALSE 0

typedef int Status;
typedef int ElemType;
typedef struct Qnode{
  int data;
  struct Qnode *next;
} Qnode,*Qlink;

typedef struct {
  Qlink front;
  Qlink rear;
} Queue;

Status initQueue(Queue *Q){
  Q->front = Q->rear = (Qlink)malloc(sizeof(Qnode));
  Q->front->next = NULL;
  return OK;
}

Status isEmpty(Queue Q){
  if(Q.front == Q.rear)return TRUE;
  else return FALSE;
}

Status enQueue(Queue *Q,ElemType e){
  Qlink new = (Qlink)malloc(sizeof(Qnode));
  new->data = e;
  new->next = NULL;
  Q->rear->next = new;
  Q->rear = new;
  return OK;
}


Status deQueue(Queue *Q,ElemType *e){
  if(isEmpty(*Q))return ERROR;
  Qlink tmp = Q->front->next;
  Q->front->next = tmp->next;
  *e = tmp->data;
  if(Q->rear == tmp)Q->rear = Q->front;
  free(tmp);
  return OK;
}

Status destoryQueue(Queue *Q){
  while(Q->front != NULL){
    Q->rear = Q->front->next;
    free(Q->front);
    Q->front=Q->rear;
  }
  return OK;
}


int main(){
  int val;
  char sel;
 
  Queue Q;
  initQueue(&Q);
 
  while(1){
    printf("enter you choose[e|d|D]:");
    sel = getchar();

    if(sel == e){
      printf("enter value:");
      scanf("%d",&val);
      enQueue(&Q,val);
    }

    else if(sel == d){
      deQueue(&Q,&val);
      printf("value is %d\n",val);
      sleep(1);
    }
 
    else if(sel == D){
      destoryQueue(&Q);
    }
  }
}

 

判断是否为回文

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

#define OK 1
#define ERROR 0
#define STACK_MAX 100
#define QUEUE_MAX 100

typedef char ElemType;
typedef int  Status;

typedef struct{
  ElemType * base;
  ElemType * top;
} Stack;

typedef struct{
  ElemType *base;
  int front;
  int rear;
} Queue;

//****************************
//      stack library
//****************************
Status initStack(Stack *s){
  s->base = (ElemType*)malloc(STACK_MAX * sizeof(ElemType));
  s->top = s->base;
  return OK;
}

Status pushStack(Stack *s,ElemType e){
  if(s->top - s->base ==STACK_MAX)return ERROR;
  *s->top=e;
  s->top++;
  return OK;
}

Status popStack(Stack *s,ElemType *e){
  if(s->top - s->base == 0)return ERROR;
  *e = *(--s->top);
  return OK;
}


//****************************
//       queue library
//****************************
Status initQueue(Queue *q){
  q->base = (ElemType*)malloc(QUEUE_MAX * sizeof(ElemType));
  q->front = q->rear = 0;
  return OK;
}

Status enQueue(Queue *q,ElemType e){
  if(q->rear+1%QUEUE_MAX==q->front)return ERROR;
  *(q->base + q->rear) = e;
  q->rear = q->rear+1%QUEUE_MAX;
  return OK;
}

Status deQueue(Queue *q,ElemType *e){
  if((q->rear-q->front+QUEUE_MAX)%QUEUE_MAX==0)
    return ERROR;
  *e = *(q->base + q->front);
  q->front = (q->front+1)%QUEUE_MAX;
  return OK;
}

Status checkPalindrome(char *str){
  char c1,c2;
  char *p = str;

  Stack S;
  Queue Q;
 
  //init
  initStack(&S);
  initQueue(&Q);
 
  //input
  while(*p!=\n){
    pushStack(&S,*p);
    enQueue(&Q,*p);
    p++;
  }

  //output
  while(S.top!=S.base){
    popStack(&S,&c1);
    deQueue(&Q,&c2);
    if(c1!=c2)return ERROR;
  }

  return OK;
}

int main(){
   char test[100];
   printf("This is check sentence if it is palindarome\n");
   printf("enter the Ctrl + C to exit programe\n");
   while(1){
     printf("enter a string:");
     fgets(test,100,stdin);
     if(checkPalindrome(test))
       printf("yes,it is\n");
     else
       printf("no,it isn‘t\n");
   }
}

 

以上是关于链队列代码及应用的主要内容,如果未能解决你的问题,请参考以下文章

# Java 常用代码片段

数据结构之链式队列的代码实现及有趣应用

数据结构之链式队列的代码实现及有趣应用

循环队列原理及在单片机串口通讯的应用

java常见队列及应用详解

栈与队列:链队列算法+可执行代码