链队列代码及应用

链队列代码

#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");
   }
}
时间: 2024-10-05 00:42:29

链队列代码及应用的相关文章

数据结构——链队列实现二叉树的层次遍历

在二叉树的遍历这篇博客中https://www.cnblogs.com/wkfvawl/p/9901462.html 对于二叉树的层次遍历我只是给出了基于C++ STL的代码,这里我使用数据结构的链表,构建一个链队列来实现.这也算是我第一次使用链队列来完成某个任务,链队列代码还是来自课本,因为之前使用C++ STL时,queue中的某些函数是有返回值的列如Q.front(),而有些却没有返回值像Q.push(p),Q.pop(),就连有没有参数也是不同的,在这里我没有改动课本上的代码来适应自己的

【算法设计-链栈和链队列】链栈和链队列的实现

1.链队列.利用带有头结点的单链表来实现链队列,插入和删除的复杂度都为o(1) 代码: #include<stdio.h> #include<stdlib.h> typedef struct Qnode { int data; Qnode *next; }Qnode; typedef struct LinkQueue { Qnode *front; Qnode *rear; }LinkQueue; void initialize(LinkQueue *LinkQueue) { Li

链队列的初始化、入队、出队等操作实现

链队列的初始化.入队.出队等基本操作实现代码如下: #include<iostream> using namespace std; #define  TRUE 1 #define  FALSE 0 //链队列定义 typedef struct Node { int data;//数据域 struct Node *next;//指针域 }LinkQueueNode; typedef struct { LinkQueueNode *front;//队头指针front LinkQueueNode *

java实现链队列

java实现链队列的类代码: package linkqueue; public class LinkQueue { class Element { Object elem; Element next; } private Element front; private Element rear; private Element header = null; /** * 初始化队列 * */ void initQueue() { header = new Element(); front = ne

数据结构_线性表_顺序队列_循环队列_链队列

个位看官,由于队列操作相对简单,我啥也不多说,直接上代码,欢迎验证!!! #pragma mark --abstract //队列(queue)是只允许在表的一端进行插入,在表的另一端进行删除的线性表,允许插入的一端称为队尾(rear) //允许删除的一端叫做队头(font),不含元素的队列称为空队列 //队列的特点是先进先出(FIFO线性表) #pragma mark --分类 //1.队列的顺序存储结构称为顺序队列(sequential queue),他是由存放队列的一维数组和分别指向队头和

链队列——队列的链式表示和实现

一.单链队列的链式存储结构 相关代码下载链接:http://download.csdn.net/detail/shengshengwang/8141633 队列是操作受限的线性表,只允许在队尾插入元素,在队头删除元素.对于链队列结构,为了便于插入元素,设立了队尾指针,这样插入元素的操作便与队列长度无关.存储结构,如下所示: typedef int QElemType; typedef struct QNode { QElemType data; QNode *next; } *QueuePtr;

C语言 链队列基本操作

C语言链队列基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h> /* C语言链队列基本操作 2014年7月11日10:11:41 */ typedef int qType; typedef struct node { qType data; struct node *pNext; }Node,*pNode; typedef struct queue { pNode front; pNode re

数据结构 - 链队列的实行(C语言)

数据结构-链队列的实现 1 链队列的定义 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已, 我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点,如下图所示. 空队列时,front和rear都指向头结点,如下图所示. 链队列的结构为: typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */ typedef struct QNode /* 结点结构 */ { QElemTy

链栈和链队列的类实现

#include<iostream>#include<cassert> using namespace std; template <class T>//链栈 struct LinkNode{T data;LinkNode<T> *Link;LinkNode(LinkNode<T> *pr=NULL){Link=pr;}LinkNode(const T& item,LinkNode<T> *pr=NULL){data=item