Triển khai hàng đợi bằng cách sử dụng mảng trong Python

Hàng đợi tròn là hàng đợi trong đó tất cả các phần tử được nối với nhau để tạo thành một hình tròn. Hàng đợi tròn có thể được thực hiện với mảng và danh sách được liên kết. Trong triển khai mảng, phía trước và phía sau bao quanh (hoạt động modulo) đến đầu mảng. Trong thực hiện danh sách được liên kết, nút cuối cùng liên kết trở lại nút phía trước. Trong bài đăng này, triển khai hàng đợi vòng tròn đang sử dụng mảng

Mục lục

Bản đồ triển khai hàng đợi

Phần 1 – Triển khai hàng đợi với danh sách liên kết

Triển khai hàng đợi bằng cách sử dụng mảng trong Python

Phần 2 – Triển khai hàng đợi vòng với mảng
Phần 3 – Danh sách liên kết vòng (Circular queue)
Phần 4 – Danh sách liên kết kép (Deque)

Enqueue trong việc thực hiện hàng đợi vòng tròn

Đầu tiên chúng ta khai báo một mảng. Trong Java, nếu bạn sử dụng mảng (không phải ArrayList), bạn phải chỉ định maxSize. Nếu mảng đạt đến kích thước tối đa, bạn không thể thêm phần tử nữa. front Index và rear Index là chỉ số của phần tử phía trước và phần tử phía sau. Khi hàng đợi trống, chúng là -1. Độ dài là để theo dõi số lượng phần tử trong hàng đợi

Để enqueue là thêm phần tử ở phía sau. rearIndex được tăng thêm 1. Nếu rearIndex vượt quá maxSize, chúng tôi sử dụng thao tác modulo (hoặc “mod”, “%”) để có được rearIndex mới với phạm vi maxSize

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

lớp công khai CircularQueueArray<T> {

riêng tư T[] queueArray;  

private int maxSize; // Kích thước của Thông tư

riêng tư int frontIndex, rearIndex;

riêng tư int độ dài = 0;

  

// hàm tạo, Thời gian O(1), Không gian O(1)

@SuppressWarnings("unchecked")

công khai CircularQueueArray(int kích thước) {

Kích thước tối đa = kích thước;

    frontIndex = - 1;

    rearIndex = - 1;

    queueArray = (T[])new Object[maxSize];

}

//Thêm vào phía sau, Thời gian O(1), Khoảng cách O(1)

công khai vô hiệu hàng đợi(T value) {

    nếu (là Đầy đủ()) {

     Hệ thống. ra. println("Hàng đợi đã đầy, không thể đưa vào hàng đợi " + value);

     return;

    }

    if (frontIndex == -1) //empty

     frontIndex = 0;

    rearIndex = (rearIndex + 1) % maxSize;

    queueArray[rearIndex] = value;

    độ dài ++ ;     

}

Javascript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

lớp CircularQueueArray {

 

// hàm tạo, Thời gian O(1), Không gian O(1)

hàm tạo(kích thước) {

này. Kích thước tối đa = kích thước;

    cái này. frontIndex = - 1;

    cái này. rearIndex = - 1;

    cái này. queueArray = [];

        cái này. độ dài = 0;  <

}

 

//Thêm vào phía sau, Thời gian O(1), Khoảng cách O(1)

enqueue(giá trị) {

    nếu (điều này. isFull()) {

     bảng điều khiển. log("Hàng đợi đã đầy, không thể đưa vào hàng đợi " + value);

     return;

    }

    nếu (điều này. frontIndex == - 1)

            này. frontIndex = 0;

        cái này. rearIndex = (this. rearIndex + 1) % . this.Kích thước tối đa;

    cái này. queueArray[này. rearIndex] = giá trị;

    cái này. độ dài ++ ;     

}

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

lớp CircularQueueArray.

    #hàm tạo, Thời gian O(1), Không gian O(1)

    def __init__(self, size):

        bản thân. Kích thước tối đa = kích thước

        bản thân. queueArray = [Không có] * size

        bản thân. frontIndex = self. rearIndex = - 1

        bản thân. độ dài = 0

 

    #Thêm ở phía sau, Thời gian O(1), Khoảng cách O(1)

    def enqueue(self, value):

        nếu chính mình. isFull(). #full

            in("Hàng đợi tròn đã đầy, không thể xếp hàng" + str(value))

            return

        nếu (bản thân. frontIndex == - 1 . : #empty

            bản thân. frontIndex = 0

        bản thân. rearIndex = (self. rearIndex + 1) % . self.Kích thước tối đa

        bản thân. queueArray[self. rearIndex] = giá trị

        bản thân. độ dài += 1

nguệch ngoạc

Triển khai hàng đợi bằng cách sử dụng mảng trong Python

Dequeue trong việc thực hiện hàng đợi vòng tròn

Hoạt động dequeue là loại bỏ nút phía trước khỏi hàng đợi. Trước tiên, chúng tôi kiểm tra xem hàng đợi có trống không. Nếu nó trống, phương thức sẽ trả về. Chúng tôi cũng kiểm tra xem chỉ có một phần tử trong hàng đợi. Nếu đúng như vậy, chúng ta nên đặt lại front Index và rear Index thành -1 sau khi xóa phần tử cuối cùng

Để dequeue, chúng ta tăng frontIndex lên 1. Giống như enqueue, nếu frontIndex vượt maxSize thì ta phải đưa phần tử về index 0. Chúng tôi sử dụng thao tác modulo (hoặc “mod”, “%”) để lấy frontIndex mới. Xin lưu ý đối với phần tử dequeue, chúng tôi chỉ cập nhật frontIndex. Giá trị ban đầu vẫn ở nguyên vị trí cho đến khi nó được thay thế bằng giá trị mới

Java

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//Xoá từ phía trước, Thời gian O(1), Khoảng cách O(1)

công khai T dequeue() {

    if (isEmpty()) {

     Hệ thống. ra. println("Hàng trống");

     return null;

    }

    T  mục = queueArray[frontIndex];

    if (frontIndex == rearIndex) { //last one, reset

     frontIndex = - 1;

        rearIndex = - 1;

    }  khác {

        frontIndex = (frontIndex + 1) % maxSize;

    }

    độ dài -- ;

    return (item);

}

Javascript

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

//Xoá từ phía trước, Thời gian O(1), Khoảng cách O(1)

dequeue() {

    nếu (điều này. isEmpty()) {

     bảng điều khiển. log("Hàng trống");

     return null;

    }

    var item = this.queueArray[này. frontIndex];

    nếu (điều này. frontIndex == this. rearIndex) { //còn một phần tử

     cái này. frontIndex = - 1;

        cái này. rearIndex = - 1;

    }  khác {

        cái này. frontIndex = (this. frontIndex + 1) % . this.Kích thước tối đa;

    }

    cái này. độ dài -- ;

    return (item);

}

con trăn

1

2

3

4

5

6

7

8

9

10

11

12

13

14

    # Xóa từ phía trước, Thời gian O(1), Khoảng cách O(1)

    def dequeue(self):

        nếu chính mình. isEmpty().

            in("Hàng đợi vòng tròn trống, không thể xếp hàng")

            return

        mục = bản thân. queueArray[self. frontIndex]

        nếu (bản thân. frontIndex == self. rearIndex). Còn #một mục

            bản thân. frontIndex = - 1

            bản thân. rearIndex = - 1

            trả lại mục

        khác.           

            bản thân. frontIndex = (self. frontIndex + 1) % . self.Kích thước tối đa

        bản thân. độ dài -= 1

        trả lại mặt hàng

nguệch ngoạc

Triển khai hàng đợi bằng cách sử dụng mảng trong Python


nhìn lén

Peek là trả về giá trị tại firstIndex. Tương tự như dequeue, chúng ta nên kiểm tra xem hàng đợi có trống không. Nếu nó không trống, hãy trả về giá trị

Java

1

2

3

4

5

6

7

8

// Trả về giá trị phía trước, Thời gian O(1), Khoảng cách O(1)

công chúng T nhìn trộm() {

    if (isEmpty()) {

     Hệ thống. ra. println("Hàng trống");

     return null;

    }

    return queueArray[frontIndex];

}

Javascript

1

2

3

4

5

6

7

8

// Trả về giá trị phía trước, Thời gian O(1), Khoảng cách O(1)

nhìn trộm() {

    nếu (điều này. isEmpty()) {

     bảng điều khiển. log("Hàng trống");

     return null;

    }

    trả lại cái này. queueArray[này. frontIndex];

}

con trăn

1

2

3

4

5

6

    #Trả về giá trị phía trước, Thời gian O(1), Khoảng cách O(1)

    def peek(self):

        nếu chính mình. isEmpty().

            in("Hàng đợi vòng tròn trống, không thể xếp hàng")

            return

        trả về chính mình. queueArray[self. frontIndex]


In

In là in tất cả các phần tử trong hàng đợi tròn. Bắt đầu từ frontIndex, vòng lặp for hoặc vòng lặp while được sử dụng để lặp qua từng vị trí cho đến rearIndex. Cũng như enqueue và dequeue, tăng chỉ số i lên 1 thì mod maxSize

Java

1

2

3

4

5

6

7

8

9

10

11

12

//In tất cả, Thời gian O(n), Khoảng cách O(1), n ​​là số mục trong hàng đợi

công khai vô hiệu in() {

if (isEmpty()) {

     Hệ thống. ra. println("Hàng trống");

     return;

    }

Hệ thống. ra. in("Hàng đợi vòng tròn. ");

    int i;

    cho (i = frontIndex; i ! = rearIndex; i = (i + 1) % maxSize)

     Hệ thống. ra. in(queueArray[i] + " ");

    Hệ thống. ra. println(queueArray[i]);

}

Javascript

1

2

3

4

5

6

7

8

9

10

11

12

13

//In tất cả, Thời gian O(n), Khoảng cách O(1), n ​​là số mục trong hàng đợi

in() {

nếu (điều này. isEmpty()) {

     bảng điều khiển. log("Hàng trống");

     return;

    }

var str = "Hàng đợi. ";

    var i;

    cho (i = this.frontIndex; i . = này. rearIndex; i = ( . i + 1) % this.Kích thước tối đa)

            str += this. queueArray[i] + " ";

        str += này. queueArray[i];

        bảng điều khiển. log(str);

}

con trăn

1

2

3

4

5

6

7

8

9

10

11

    #In tất cả, Thời gian O(n), Khoảng cách O(1), n ​​là số mục trong hàng đợi

    def print(self):

        nếu chính mình. isEmpty().

            in("Hàng đợi vòng tròn trống")

            return

        in("Hàng đợi vòng tròn. ", kết thúc = "")

        i = chính mình. frontIndex  

        trong khi i . = chính mình. rearIndex.

            in(str(self.queueArray[i]) , end=" ")

            i = (i + 1) % self.Kích thước tối đa

        in(bản thân. queueArray[i])    

Tải xuống miễn phí




Khi nào thì triển khai hàng đợi tròn bằng mảng và khi nào thì dùng danh sách liên kết?

Triển khai hàng đợi bằng cách sử dụng mảng trong Python

Khi có nhiều dequeue và enqueue cùng lúc, tốt hơn là sử dụng mảng. Không gian loại bỏ có thể được tái sử dụng. Điều này làm cho việc sử dụng không gian bộ nhớ tốt hơn. Khi bạn không thể dự đoán hàng đợi vòng sẽ kéo dài bao lâu, bạn sử dụng danh sách liên kết vòng. Nó là linh hoạt để mở rộng hoặc thu nhỏ

Công thức của hàng đợi tròn sử dụng mảng là gì?

Trong triển khai mảng, bạn khai báo frontIndex và rearIndex để theo dõi vị trí của phần tử phía trước và phía sau. Cả hai đều bắt đầu từ -1. Để bao quanh sao cho frontIndex và rearIndex nằm trong phạm vi độ dài của mảng, bạn sử dụng toán tử modulo %. Để xếp hàng, công thức là rearIndex = (rearIndex + 1) % maxSize. Để dequeue, nó là frontIndex = (frontIndex + 1) % maxSize

Chúng ta có thể triển khai hàng đợi bằng cách sử dụng mảng không?

Hàng đợi là một loại cấu trúc dữ liệu có thể được triển khai bằng cách sử dụng mảng hoặc danh sách liên kết .

Làm cách nào để triển khai hàng đợi vòng tròn bằng mảng?

Triển khai hàng đợi vòng tròn sử dụng Mảng .
#include .
# xác định tối đa 6
hàng đợi int [tối đa];
int phía trước = -1;
int phía sau = -1;
//hàm chèn phần tử vào hàng đợi tròn
void enqueue(phần tử int)

Loại dữ liệu nào là tốt nhất để triển khai hàng đợi Python?

Lớp deque có thể được sử dụng trong cả Hàng đợi và dưới dạng ngăn xếp vì nó loại bỏ và thêm các phần tử một cách hiệu quả. Bộ sưu tập. deque có thể là một lựa chọn tốt cho cấu trúc dữ liệu hàng đợi trong thư viện chuẩn của Python

Các vấn đề của việc thực hiện hàng đợi mảng là gì?

Hạn chế của việc triển khai mảng . Không gian của mảng, được sử dụng để lưu trữ các phần tử hàng đợi, không bao giờ có thể được sử dụng lại để lưu trữ các phần tử của hàng đợi đó vì các phần tử chỉ có thể được chèn vào giao diện người dùng và giá trị của phía trước có thể cao đến mức, tất cả không gian . Memory wastage : The space of the array, which is used to store queue elements, can never be reused to store the elements of that queue because the elements can only be inserted at front end and the value of front might be so high so that, all the space before that, can never be filled.