首页 > 编程语言 > 详细

五种编程语言解释数据结构与算法—队列

时间:2020-03-07 18:57:58      阅读:72      评论:0      收藏:0      [点我收藏+]

五种编程语言解释数据结构与算法—队列

1、队列的基本概念

1.1、队列的逻辑结构和特点

技术分享图片

1.2、队列的基本操作

技术分享图片

2、队列的顺序存储结构

2.1、逻辑结构示意图

技术分享图片

2.2、队列的判空条件

技术分享图片

2.3、队列的求队长的操作

技术分享图片

3、循环队列介绍

3.1、逻辑结构示意图

技术分享图片

3.2、如何解决循环队列队空队满条件的判断冲突

技术分享图片

3.2.1、方案一:牺牲一个存储单元

技术分享图片

3.2.2、方案二:增加一个变量代表元素的个数

技术分享图片

3.2.3、方案三:增加一个tag标识

技术分享图片

3.3、循环队列的基本操作

3.3.1、初始化操作

技术分享图片

3.3.2、判空操作

技术分享图片

3.3.3、入队操作

技术分享图片

3.3.4、出队操作

技术分享图片

4、队列的链式存储结构

4.1、逻辑结构示意图

技术分享图片

4.2、初始化操作

技术分享图片

4.3、判空操作

技术分享图片

4.4、入队操作

技术分享图片

4.5、出队操作

技术分享图片

5、双端队列

5.1、逻辑示意图

技术分享图片

5.2、输出受限的双端队列

技术分享图片

5.3、输入受限的双端队列

技术分享图片

接下来,使用编程语言来实现顺序存储的队列结构

6、C语言实现

6.1、SeqQueue.h文件中的内容

#ifndef XGP_STUDY_DEMO53_SEQQUEUE_H
#define XGP_STUDY_DEMO53_SEQQUEUE_H

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

#define MAX_SIZE 1024

//顺序队列结构体
typedef struct SEQQUEUE {
    void* data[MAX_SIZE];
    int size;
}SeqQueue;

//初始化
SeqQueue* Init_SeqQueue();
//入队
void Push_SeqQueue(SeqQueue* queue,void* data);
//放回队头元素
void* Front_SeqQueue(SeqQueue* queue);
//出队
void* Pop_SeqQueue(SeqQueue* queue);
//放回队尾的元素
void* Back_SeqQueue(SeqQueue* queue);
//放回大小
int Size_SeqQueue(SeqQueue* queue);
//清空队列
void Clear_SeqQueue(SeqQueue* queue);
//销毁
void FreeSpace_SeqQueue(SeqQueue* queue);

#endif //XGP_STUDY_DEMO53_SEQQUEUE_H

6.2、SeqQueue.c文件中的内容

#include "SeqQueue.h"

//初始化
SeqQueue* Init_SeqQueue() {

    SeqQueue* queue = (SeqQueue*)malloc(sizeof(SeqQueue));

    for(int i = 0;i < MAX_SIZE;i++) {
        queue->data[i] = NULL;
    }
    queue->size = 0;
    return queue;
}
//入队
void Push_SeqQueue(SeqQueue* queue,void* data) {
    //数组的左边当作队头
    if(queue == NULL || data == NULL || queue->size == MAX_SIZE) return;

    queue->data[queue->size] = data;
    queue->size++;
}
//放回队头元素
void* Front_SeqQueue(SeqQueue* queue) {
    if(queue == NULL || queue->size == 0) return NULL;
    return queue->data[0];
}
//出队
void* Pop_SeqQueue(SeqQueue* queue) {
    if(queue == NULL || queue->size == 0) return NULL;
    //需要移动元素
    void* save = queue->data[0];
    for(int i = 0;i < queue->size - 1;i++) {
        queue->data[i] = queue->data[i+1];
    }
    queue->size--;
    return save;
}
//放回队尾的元素
void* Back_SeqQueue(SeqQueue* queue) {
    if(queue == NULL || queue->size == 0) return NULL;
    return queue->data[queue->size - 1];
}
//放回大小
int Size_SeqQueue(SeqQueue* queue) {
    if(queue == NULL) return -1;
    return queue->size;
}
//清空队列
void Clear_SeqQueue(SeqQueue* queue) {
    if(queue == NULL) return;
    queue->size = 0;
}
//销毁
void FreeSpace_SeqQueue(SeqQueue* queue) {
    if(queue == NULL) return;
    free(queue);
}

6.3、main.c文件中的内容

#include "SeqQueue.h"
#include <string.h>

typedef struct PERSON {
    char name[64];
    int age;
}Person;

int main() {
    //创建队列
    SeqQueue* queue = Init_SeqQueue();
    //创建数据
    Person p1,p2,p3,p4,p5;
    strcpy(p1.name,"aaa");
    strcpy(p2.name,"bbb");
    strcpy(p3.name,"ccc");
    strcpy(p4.name,"ddd");
    strcpy(p5.name,"eee");

    p1.age = 18;
    p2.age = 19;
    p3.age = 20;
    p4.age = 21;
    p5.age = 22;

    Push_SeqQueue(queue,&p1);
    Push_SeqQueue(queue,&p2);
    Push_SeqQueue(queue,&p3);
    Push_SeqQueue(queue,&p4);
    Push_SeqQueue(queue,&p5);

    //输出队尾元素
    Person* backP = (Person*)Back_SeqQueue(queue);
    printf("Name:%s\tAge:%d\n",backP->name,backP->age);
    printf("============================================\n");

    while (Size_SeqQueue(queue) > 0) {
        //取出队头元素
        Person* p = (Person*)Pop_SeqQueue(queue);;
        printf("Name:%s\tAge:%d\n",p->name,p->age);
    }

    //销毁
    FreeSpace_SeqQueue(queue);

    return 0;
}

6.4、输出结果

Name:eee        Age:22
============================================
Name:aaa        Age:18
Name:bbb        Age:19
Name:ccc        Age:20
Name:ddd        Age:21
Name:eee        Age:22

Process finished with exit code 0

7、C++语言实现

7.1、SeqQueue.h文件中的内容

#ifndef XGP_STUDY_DEMO54_SEQQUEUE_H
#define XGP_STUDY_DEMO54_SEQQUEUE_H

#include <iostream>
using namespace std;

#define MAX_SIZE 1024

template <class T>
class SeqQueue {
private:
    T* data[MAX_SIZE];
    int size;

public:
    SeqQueue();
    //入队
    void Push_SeqQueue(T* data);
//放回队头元素
    T* Front_SeqQueue();
//出队
    T* Pop_SeqQueue();
//放回队尾的元素
    T* Back_SeqQueue();
//放回大小
    int Size_SeqQueue();
//清空队列
    void Clear_SeqQueue();
    ~SeqQueue();
};


#endif //XGP_STUDY_DEMO54_SEQQUEUE_H

7.2、SeqQueue.cpp文件中的内容

#include "SeqQueue.h"

template<class T>
SeqQueue<T>::SeqQueue() {
    for(int i = 0;i < MAX_SIZE;i++) {
        this->data[i] = NULL;
    }
    this->size = 0;
}

template<class T>
void SeqQueue<T>::Push_SeqQueue(T *data) {
    //数组的左边当作队头
    if(data == NULL || this->size == MAX_SIZE) return;

    this->data[this->size] = data;
    this->size++;
}

template<class T>
T *SeqQueue<T>::Front_SeqQueue() {
    if(this->size == 0) return NULL;
    return this->data[0];
}

template<class T>
T *SeqQueue<T>::Pop_SeqQueue() {
    if(this->size == 0) return NULL;
    //需要移动元素
    T* save = this->data[0];
    for(int i = 0;i < this->size - 1;i++) {
        this->data[i] = this->data[i+1];
    }
    this->size--;
    return save;
}

template<class T>
T *SeqQueue<T>::Back_SeqQueue() {
    if(this->size == 0) return NULL;
    return this->data[this->size - 1];
}

template<class T>
int SeqQueue<T>::Size_SeqQueue() {
    return this->size;
}

template<class T>
void SeqQueue<T>::Clear_SeqQueue() {
    this->size = 0;
}

template<class T>
SeqQueue<T>::~SeqQueue() {
    cout<<"销毁方法已启动"<<endl;
}

7.3、main.cpp文件中的内容

#include "SeqQueue.cpp"

class Person {
public:
    string name;
    int age;

    Person(const string &name, int age) : name(name), age(age) {}

    friend ostream &operator<<(ostream &os, const Person &person) {
        os << "name: " << person.name << " age: " << person.age;
        return os;
    }
};

int main() {
    //创建队列
    SeqQueue<Person>* queue = new SeqQueue<Person>();
    //创建数据
    Person p1("aaa",18);
    Person p2("bbb",19);
    Person p3("ccc",20);
    Person p4("ddd",21);
    Person p5("eee",22);

    queue->Push_SeqQueue(&p1);
    queue->Push_SeqQueue(&p2);
    queue->Push_SeqQueue(&p3);
    queue->Push_SeqQueue(&p4);
    queue->Push_SeqQueue(&p5);


    //输出队尾元素
    Person* backP = queue->Back_SeqQueue();
    cout<<*backP<<endl;
    cout<<"========================"<<endl;

    while (queue->Size_SeqQueue() > 0) {
        //取出队头元素
        Person* p = queue->Pop_SeqQueue();;
        cout<<*p<<endl;
    }

    delete(queue);
    return 0;
}

7.4、输出结果

name: eee age: 22
========================
name: aaa age: 18
name: bbb age: 19
name: ccc age: 20
name: ddd age: 21
name: eee age: 22
销毁方法已启动

Process finished with exit code 0

8、Java语言实现

8.1、SeqQueue.java文件中的内容

package com.xgp.队列;

public interface SeqQueue<T> {
    //入队
    void Push_SeqQueue(T data);
    //放回队头元素
    T Front_SeqQueue();
    //出队
    T Pop_SeqQueue();
    //放回队尾的元素
    T Back_SeqQueue();
    //放回大小
    int Size_SeqQueue();
    //清空队列
    void Clear_SeqQueue();
    //销毁
    void FreeSpace_SeqQueue();
}

8.2、SeqQueueImpl.java文件中的内容

package com.xgp.队列;

public class SeqQueueImpl<T> implements SeqQueue<T> {

    private int MAX_SIZE = 1024;

    private Object[] data = new Object[MAX_SIZE];
    private int size;

    public SeqQueueImpl() {
        for(int i = 0;i < MAX_SIZE;i++) {
            this.data[i] = null;
        }
        this.size = 0;
    }

    public SeqQueueImpl(int MAX_SIZE) {
        this.MAX_SIZE = MAX_SIZE;
        for(int i = 0;i < MAX_SIZE;i++) {
            this.data[i] = null;
        }
        this.size = 0;
    }

    @Override
    public void Push_SeqQueue(T data) {
        //数组的左边当作队头
        if(data == null || this.size == MAX_SIZE) return;

        this.data[this.size] = data;
        this.size++;
    }

    @Override
    public T Front_SeqQueue() {
        if(this.size == 0) return null;
        return (T)this.data[0];
    }

    @Override
    public T Pop_SeqQueue() {
        if(this.size == 0) return null;
        //需要移动元素
        T save = (T)this.data[0];
        for(int i = 0;i < this.size - 1;i++) {
            this.data[i] = this.data[i+1];
        }
        this.size--;
        return save;
    }

    @Override
    public T Back_SeqQueue() {
        if(this.size == 0) return null;
        return (T)this.data[this.size - 1];
    }

    @Override
    public int Size_SeqQueue() {
        return this.size;
    }

    @Override
    public void Clear_SeqQueue() {
        this.size = 0;
    }

    @Override
    public void FreeSpace_SeqQueue() {
        Clear_SeqQueue();
        System.gc();
        System.out.println("对象已被销毁");
    }
}

8.3、Main.java文件中的内容

package com.xgp.队列;

public class Main {
    public static void main(String[] args) {
        //创建队列
        SeqQueue<Person> queue = new SeqQueueImpl<>();
        //创建数据
        Person p1 = new Person("aaa",18);
        Person p2 = new Person("bbb",19);
        Person p3 = new Person("ccc",20);
        Person p4 = new Person("ddd",21);
        Person p5 = new Person("eee",22);

        queue.Push_SeqQueue(p1);
        queue.Push_SeqQueue(p2);
        queue.Push_SeqQueue(p3);
        queue.Push_SeqQueue(p4);
        queue.Push_SeqQueue(p5);


        //输出队尾元素
        Person backP = queue.Back_SeqQueue();
        System.out.println(backP);
        System.out.println("===================================");

        while (queue.Size_SeqQueue() > 0) {
            //取出队头元素
            Person p = queue.Pop_SeqQueue();;
            System.out.println(p);
        }

        queue.FreeSpace_SeqQueue();
    }
}

class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

8.4、输出结果

Person{name='eee', age=22}
===================================
Person{name='aaa', age=18}
Person{name='bbb', age=19}
Person{name='ccc', age=20}
Person{name='ddd', age=21}
Person{name='eee', age=22}
对象已被销毁

进程完成,退出码 0

9、JavaScript语言实现

9.1、SeqQueue.js文件中的内容

class SeqQueue {
    constructor() {
        this.MAX_SIZE = 1024;
        this.data = [];
        for(var i = 0;i < this.MAX_SIZE;i++) {
            this.data[i] = null;
        }
        this.size = 0;
    }
    
    Push_SeqQueue(data) {
        //数组的左边当作队头
        if(data == null || this.size == this.MAX_SIZE) return;

        this.data[this.size] = data;
        this.size++;
    }

    Front_SeqQueue() {
        if(this.size == 0) return null;
        return this.data[0];
    }

    Pop_SeqQueue() {
        if(this.size == 0) return null;
        //需要移动元素
        var save = this.data[0];
        for(var i = 0;i < this.size - 1;i++) {
            this.data[i] = this.data[i+1];
        }
        this.size--;
        return save;
    }

    Back_SeqQueue() {
        if(this.size == 0) return null;
        return this.data[this.size - 1];
    }

    Size_SeqQueue() {
        return this.size;
    }

     Clear_SeqQueue() {
        this.size = 0;
    }

    FreeSpace_SeqQueue() {
        this.Clear_SeqQueue();
        console.log("对象已被销毁");
    }
}

9.2、SeqQueue.html文件中的内容

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="SeqQueue.js"></script>
</head>
<body>
    <script>
        class Person {
            constructor(name,age) {
                this.name = name;
                this.age = age;
            }

            print() {
                console.log("Name:" + this.name + "\t" + "Age:" + this.age);
            }
        }

        //创建队列
        var queue = new SeqQueue();
        //创建数据
        var p1 = new Person("aaa",18);
        var p2 = new Person("bbb",19);
        var p3 = new Person("ccc",20);
        var p4 = new Person("ddd",21);
        var p5 = new Person("eee",22);

        queue.Push_SeqQueue(p1);
        queue.Push_SeqQueue(p2);
        queue.Push_SeqQueue(p3);
        queue.Push_SeqQueue(p4);
        queue.Push_SeqQueue(p5);


        //输出队尾元素
        var backP = queue.Back_SeqQueue();
        backP.print();
        console.log("===================================");

        while (queue.Size_SeqQueue() > 0) {
            //取出队头元素
            var p = queue.Pop_SeqQueue();
            p.print();
        }

        queue.FreeSpace_SeqQueue();
    </script>
</body>
</html>

9.3、输出结果

Name:eee    Age:22 SeqQueue.html:18:25
=================================== SeqQueue.html:41:17
Name:aaa    Age:18 SeqQueue.html:18:25
Name:bbb    Age:19 SeqQueue.html:18:25
Name:ccc    Age:20 SeqQueue.html:18:25
Name:ddd    Age:21 SeqQueue.html:18:25
Name:eee    Age:22 SeqQueue.html:18:25
对象已被销毁 SeqQueue.js:50:17

10、Python语言实现

10.1、SeqQueue.py文件中的内容

class SeqQueue:
    def __init__(self) -> None:
        self.MAX_SIZE = 1024
        self.data = [None]*self.MAX_SIZE
        for i in range(0,self.MAX_SIZE):
            self.data[i] = None
        self.size = 0

    def Push_SeqQueue(self,data):
        if(data == None or self.size == self.MAX_SIZE):
            return
        self.data[self.size] = data
        self.size += 1

    def Front_SeqQueue(self):
        if(self.size == 0):
            return None
        return self.data[0]

    def Pop_SeqQueue(self):
        if(self.size == 0):
            return None
        save = self.data[0]
        for i in range(0,self.size):
            self.data[i] = self.data[i+1]
        self.size -= 1
        return save

    def Back_SeqQueue(self):
        if(self.size == 0):
            return None
        return self.data[self.size - 1]

    def Size_SeqQueue(self):
        return self.size

    def Clear_SeqQueue(self):
        self.size = 0

    def FreeSpace_SeqQueue(self):
        self.Clear_SeqQueue()
        print("对象已被销毁")

10.2、main.py文件中的内容

from SeqQueue import *

class Person:

    def __init__(self,name,age) -> None:
        self.name = name
        self.age = age

    def __str__(self) -> str:
        return "Name:" + self.name + "\t" + "Age:" + str(self.age)

queue = SeqQueue()

p1 = Person("aaa", 18)
p2 = Person("bbb", 19)
p3 = Person("ccc", 20)
p4 = Person("ddd", 21)
p5 = Person("eee", 22)

queue.Push_SeqQueue(p1)
queue.Push_SeqQueue(p2)
queue.Push_SeqQueue(p3)
queue.Push_SeqQueue(p4)
queue.Push_SeqQueue(p5)

backP = queue.Back_SeqQueue()
print(backP)
print("======================")

while(queue.Size_SeqQueue() > 0):
    print(queue.Pop_SeqQueue())

queue.FreeSpace_SeqQueue()

10.3、输出结果

Name:eee    Age:22
======================
Name:aaa    Age:18
Name:bbb    Age:19
Name:ccc    Age:20
Name:ddd    Age:21
Name:eee    Age:22
对象已被销毁

Process finished with exit code 0

五种编程语言解释数据结构与算法—队列

原文:https://www.cnblogs.com/xgp123/p/12435964.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!