双端队列链式实现完整代码

看看思想,,,代码都是调试通过的。

#ifndef  _TWO_QUEUE_H_
#define  _TWO_QUEUE_H_

typedef int ElemType;

typedef  struct _two_queue
{
 ElemType a;
 struct _two_queue *prev;
 struct _two_queue *next;
}tq;


typedef  struct _node
{
 tq *first_head;
 tq *first_tail;
 tq *last_head;
 tq *last_tail;
}pnode;

typedef  enum _status
{
 first,last
}status;

//初始化空队列:
void init_queue(pnode *p);

//销毁队列:
void destroy_queue(pnode *p);

//判断是否为空队列:
bool is_empty(pnode *p);

//获得队头元素:
void get_head(pnode *p,ElemType *e,status sign);

//入队:
void push_queue(pnode *p,ElemType e,status sign);

//出队:
void pop_queue(pnode *p,ElemType *e,status sign);
#endif


/*双端队列函数基本操作实现如下*/

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

//初始化空队列:
void init_queue(pnode *p)
{
 if(p == NULL)
 {
  printf("error\n");
  exit(1);
 }
 else
 {
  p->first_head = NULL;
  p->first_tail = NULL;
  p->last_head = NULL;
  p->last_tail = NULL;
 }
}

//判断是否为空队列:
bool is_empty(pnode *p)
{
 return p->first_head == NULL;
}

//入队:
void push_queue(pnode *p,ElemType e,status sign)
{
 tq *tmp = (tq *)malloc(sizeof(tq)*1);
 tmp->a  = e;
 tmp->next = NULL;
 if(is_empty(p))
 {
  p->first_head = tmp;
  p->first_tail = tmp;
  p->last_head = tmp;
  p->last_tail = tmp;
 }
 else
 {
  if(sign == first)
  {
    tmp->next = p->first_head;
     p->first_head ->prev = tmp;
        p->first_tail = tmp;
     p->first_head = tmp;
  }
  else
  {
     tmp->prev = p->last_head;
     p->last_head->next = tmp;
        p->last_tail = tmp;
     p->last_head = tmp;
  }
 }

}

//出队:
void pop_queue(pnode *p,ElemType *e,status sign)
{
 if(is_empty(p))
 {
  printf("error\n");
  exit(1);
 }
 else
 {
  if(sign == first)
  {
     *e = p->first_head->a;
        p->first_head = p->first_head->next;
  }
  else
  {
     *e = p->last_head ->a;
        p->last_head = p->last_head->prev;
  }
 }
}

//销毁队列:
void destroy_queue(pnode *p)
{
 tq *s = p->first_head;
 if(is_empty(p))
 {
  printf("error\n");
  exit(1);
 }
 else
 {
  while(s)
  {
   p->first_head = p->first_head->next;
   free(s);
   s = p->first_head;
  }
  p->first_head = NULL;
  p->first_tail = NULL;
  p->last_head  = NULL;
  p->last_tail = NULL;
  printf("the queue is destroyed successfully\n ");
 }
}

//获得队头元素:
void get_head(pnode *p,ElemType *e,status sign)
{
 if(is_empty(p))
 {
  printf("the queue is NULL,no top number\n");
  exit(1);
 }
 else
 {
  if(sign == first)
  {
    *e = p->first_head->a;
  }
  else
  {
   *e = p->last_head->a;
  }
 }
}



//主函数

#include<stdio.h>
#include"two_queue.h"

int main()
{
 int n = 10;
 int x = -99;
 int k = 100;
 int y;
 int t;
 pnode m;
 init_queue(&m);
 push_queue(&m,n,first);
 push_queue(&m,k,last);
 push_queue(&m,x,first);
 //get_head(&m,&t,first);
 //printf("%d\n",t);
 //get_head(&m,&y,last);
 //printf("%d\n",y);
 pop_queue(&m,&y,first);
 //pop_queue(&m,&t,first);
 printf("%d\n",y);
 //printf("%d\n",t);
 destroy_queue(&m);
 get_head(&m,&t,first);
 printf("%d\n",t);
 return 0;
}






/* * 基于双向链表实现双端队列结构 */ package dsa; public class Deque_DLNode implements Deque { protected DLNode header;//指向头节点(哨兵) protected DLNode trailer;//指向尾节点(哨兵) protected int size;//队列中元素的数目 //构造函数 public Deque_DLNode() { header = new DLNode(); trailer = new DLNode(); header.setNext(trailer); trailer.setPrev(header); size = 0; } //返回队列中元素数目 public int getSize() { return size; } //判断队列是否为空 public boolean isEmpty() { return (0 == size) ? true : false; } //取首元素(但不删除) public Object first() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return header.getNext().getElem(); } //取末元素(但不删除) public Object last() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); return trailer.getPrev().getElem(); } //在队列前端插入新节点 public void insertFirst(Object obj) { DLNode second = header.getNext(); DLNode first = new DLNode(obj, header, second); second.setPrev(first); header.setNext(first); size++; } //在队列后端插入新节点 public void insertLast(Object obj) { DLNode second = trailer.getPrev(); DLNode first = new DLNode(obj, second, trailer); second.setNext(first); trailer.setPrev(first); size++; } //删除首节点 public Object removeFirst() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = header.getNext(); DLNode second = first.getNext(); Object obj = first.getElem(); header.setNext(second); second.setPrev(header); size--; return(obj); } //删除末节点 public Object removeLast() throws ExceptionQueueEmpty { if (isEmpty()) throw new ExceptionQueueEmpty("意外:双端队列为空"); DLNode first = trailer.getPrev(); DLNode second = first.getPrev(); Object obj = first.getElem(); trailer.setPrev(second); second.setNext(trailer); size--; return(obj); } //遍历 public void Traversal() { DLNode p = header.getNext(); while (p != trailer) { System.out.print(p.getElem()+" "); p = p.getNex
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值