zoukankan      html  css  js  c++  java
  • 数据结构之队列

    基本概念

    循环队列

    入队出队操作

    队列应用

    代码实现

    c语言(数组)

    #ifndef _QUEUE_H_
    #define _QUEUE_H_
    
    #include <malloc.h>
    
    #define TRUE        1
    #define FALSE       0
    #define ACTION_IN   0
    #define ACTION_OUT  1
    
    typedef unsigned char boolean;
    typedef struct QUEUE{
        USER_TYPE *data;
        int maxRoom;
        int head;
        int tail;
        boolean lastAction;
    } QUEUE;
    
    boolean initQueue(QUEUE **queue, int maxRoom);
    void destoryQueue(QUEUE **queue);
    boolean isQueueEmpty(QUEUE queue);
    boolean isQueueFull(QUEUE queue);
    boolean QueueIn(QUEUE *queue, USER_TYPE value);
    boolean QueueOut(QUEUE *queue, USER_TYPE *value);
    boolean readHead(QUEUE queue, USER_TYPE *value);
    
    boolean readHead(QUEUE queue, USER_TYPE *value){
        if(isQueueEmpty(queue))
            return FALSE;   
        *value = queue.data[queue.head];
    
        return TRUE;
    }
    
    boolean QueueOut(QUEUE *queue, USER_TYPE *value){
        if(!queue)
            return FALSE;
        if(isQueueEmpty(*queue))
            return FALSE;
        *value = queue->data[queue->head];
        queue->head = (queue->head+1) % queue->maxRoom;
        queue->lastAction = ACTION_OUT;
    
        return TRUE;
    }
    
    boolean QueueIn(QUEUE *queue, USER_TYPE value){
        if(!queue)
            return FALSE;
        if(isQueueFull(*queue))
            return FALSE;
        queue->data[queue->tail] = value;
        queue->tail = (queue->tail+1) % queue->maxRoom;
        queue->lastAction = ACTION_IN;
    
        return TRUE;
    }
    
    boolean isQueueFull(QUEUE queue){
        return queue.lastAction == ACTION_IN && queue.head == queue.tail;
    }
    
    boolean isQueueEmpty(QUEUE queue){
        return queue.lastAction == ACTION_OUT && queue.head == queue.tail;
    }
    
    void destoryQueue(QUEUE **queue){
        if(*queue == NULL)
            return;
        if((*queue)->data)
            free((*queue)->data);
        free(*queue);
        *queue = NULL;
    }
    
    boolean initQueue(QUEUE **queue, int maxRoom){
        if(*queue)
            return FALSE;
        if(maxRoom <= 0)
            return FALSE;
        if( (*queue = (QUEUE *)malloc(sizeof(QUEUE))) == NULL )
            return FALSE;
        if ( ((*queue)->data = (USER_TYPE *)malloc(sizeof(USER_TYPE)*maxRoom)) == NULL ){
            free(*queue);
            *queue = NULL;
            return FALSE;
        }       
    
        (*queue)->maxRoom = maxRoom;
        (*queue)->head = (*queue)->tail = 0;
        (*queue)->lastAction = ACTION_OUT;
    
        return TRUE;
    }
    
    #endif
    

      Python 版

    #version1
    class Queue(object):
        def __init__(self, maxRoom):
            self.maxRoom = maxRoom
            self.queue = []
        
        def push(self,value):
            if not self.isfull():
                self.queue.append(value)
                return True
            return False
    
        def pop(self):
            if not self.isempty():
                value = self.queue.pop()
                return value
            return
    
        def readtop(self,):
            if not self.isempty():
                return self.queue[-1]
            return 
    
        def isempty(self,):
            return len(self.queue) == 0
    
        def isfull(self):
            return len(self.queue) == self.maxRoom
    
    
    #verision2
    class Queue(object):
        '''
            last_action = 1 表示上次插入动作为push入队列,0表示出队列
        '''
    
        def __init__(self, maxRoom = 1024):
            self.maxRoom = maxRoom
            self.queue = [None for _ in range(maxRoom)]
            self.head = 0
            self.tail = 0
            self.last_action = 1
        
        def push(self,value):
            if not self.isfull():
                self.queue[self.tail] = value
                self.tail = (self.tail + 1) % self.maxRoom
                self.last_action = 0
                return True
            return False
    
        def pop(self):
            if not self.isempty():
                value = self.queue[self.head]
                self.queue[self.head] = None
                self.head = (self.head + 1) % self.maxRoom
                self.last_action = 1
                return value
            return
    
        def readtop(self,):
            if not self.isempty():
                return self.queue[head]
            return 
    
        def isempty(self,):
            return self.last_action == 1 and self.head == self.tail
    
        def isfull(self):
            return self.last_action == 0 and self.head == self.tail
    

      

  • 相关阅读:
    Linux进程相关的一些笔记
    [Project Euler] 来做欧拉项目练习题吧: 题目007
    [Project Euler] 来做欧拉项目练习题吧: 题目015
    [Project Euler] 来做欧拉项目练习题吧: 题目009
    [Project Euler] 来做欧拉项目练习题吧: 题目017
    [Project Euler] 来做欧拉项目练习题吧: 题目014
    [Project Euler] 来做欧拉项目练习题吧: 题目013
    [Project Euler] 来做欧拉项目练习题吧: 题目006
    [Project Euler] 来做欧拉项目练习题吧: 题目008
    [Project Euler] 来做欧拉项目练习题吧: 题目012
  • 原文地址:https://www.cnblogs.com/wxl-dede/p/5343148.html
Copyright © 2011-2022 走看看