- Давхар төгсгөлтэй дарааллын ангилал
- Үндсэн үйлдлүүд
- Deque Illustration
- Deque Implementation
- Програмууд
- Дүгнэлт
C++ хэл дээр Deque эсвэл Double-ended Queue-ийн талаархи гүнзгий заавар. Заавар нь Deque гэж юу вэ, үндсэн үйлдлүүд, C++ & AMP; Java хэрэгжүүлэлт ба програмууд:
Давхар төгсгөлтэй дараалал буюу энгийнээр "Deque" гэж нэрлэдэг нь Queue-ийн ерөнхий хувилбар юм.
Queue болон Deque хоёрын ялгаа нь FIFO-г дагадаггүй. (Эхлээд орж, эхлээд гарах) арга. Deque-ийн хоёрдахь онцлог нь бид урд болон хойд талын аль алинд нь элементүүдийг оруулах, хасах боломжтой юм.
Давхар төгсгөлтэй дарааллын ангилал
Deque боломжтой дараах байдлаар ангилна:
Оролтын хязгаарлалттай Deque: Оролтын хязгаарлалттай үед устгахыг хоёр төгсгөлөөс хийж болох боловч оруулахыг зөвхөн арын төгсгөлд хийж болно. дараалал.
Гаралтын хязгаарлагдмал Deque: Гаралтын хязгаарлалттай дараалалд оруулахыг хоёр төгсгөлөөс хийж болох боловч устгахыг зөвхөн нэг төгсгөлд, өөрөөр хэлбэл дарааллын урд талд хийнэ.
Мөн бид deque ашиглан стек, дарааллыг хэрэгжүүлэх боломжтой.
Үндсэн үйлдлүүд
Доорх нь deque дээр хийж болох үндсэн үйлдлүүд юм.
- урд оруулах: Дэлгэцийн урд талд зүйл оруулах эсвэл нэмэх.
- Сүүлд оруулах: Үүнд зүйл оруулах эсвэл нэмэх арын хэсэг.
- deleteFront: Дараагийн урд талын зүйлийг устгах эсвэл устгах.
- сүүлийг устгах: Устгах эсвэл устгах ар талын зүйлдараалал.
- getFront: Дэлгэцийн урд талын зүйлийг авна.
- getLast: Дарааллын сүүлчийн зүйлийг авна.
- isEmpty: Deque хоосон эсэхийг шалгана.
- isFull: Дэлгэц дүүрсэн эсэхийг шалгана.
Deque Illustration
Хоосон декгийг дараах байдлаар илэрхийлнэ:
Дараа нь бид 1-р элементийг урд талд оруулна.
Одоо бид 3-р элементийг арын хэсэгт оруулна.
Дараа нь бид 5-р элементийг урд талд, урд талын цэгүүдийг нэмэгдүүлэх үед 4.
Дараа нь бид 7-р элементийг арын хэсэгт, 9-ийг урд талд оруулна. Дохио нь доор үзүүлсэн шиг харагдах болно.
Дараа нь нэг элементийг урд талаас нь хасъя.
Тиймээс, элементүүдийг урд талд оруулах үед урд талын байрлал багасч, элемент хасах үед нэмэгддэг болохыг бид харж байна. Арын хэсгийн хувьд оруулахын тулд байрлалыг нэмэгдүүлж, арилгахын тулд багасгадаг .
Deque Implementation
C++ Deque Implementation
Бид deque хэрэгжүүлж чадна. C++ хэл дээр массив болон холбосон жагсаалтыг ашиглана. Үүнээс гадна Стандарт Загварын Номын сан (STL) нь энэхүү өгөгдлийн бүтцэд зориулсан бүх функцийг хэрэгжүүлдэг “deque” ангитай.
Deque-ийн массивын хэрэгжилтийг доор өгөв. Энэ нь хоёр төгсгөлтэй дараалал тул бид дугуй массивыг ашигласанхэрэгжилт.
#includeusing namespace std; #define MAX_size 10 // Maximum size of array or Dequeue // Deque class class Deque { int array[MAX_size]; int front; int rear; int size; public : Deque(int size) { front = -1; rear = 0; this->size = size; } // Operations on Deque: void insertfront(int key); void insertrear(int key); void deletefront(); void deleterear(); int getFront(); int getRear(); // Check if Deque is full bool isFull() return ((front == 0 && rear == size-1) // Check if Deque is empty bool isEmpty(){ return (front == -1); } }; // Insert an element at front of the deque void Deque::insertfront(int key) { if (isFull()) { cout "Overflow!!\n" endl; return; } // If queue is initially empty,set front=rear=0; start of deque if (front == -1) { front = 0; rear = 0; } else if (front == 0) // front is first position of queue front = size - 1 ; else // decrement front 1 position front = front-1; array[front] = key ; // insert current element into Deque } // insert element at the rear end of deque void Deque ::insertrear(int key) { if (isFull()) { cout " Overflow!!\n " endl; return; } // If queue is initially empty,set front=rear=0; start of deque if (front == -1) { front = 0; rear = 0; } else if (rear == size-1) // rear is at last position of queue rear = 0; else // increment rear by 1 position rear = rear+1; array[rear] = key ; // insert current element into Deque } // Delete element at front of Deque void Deque ::deletefront() { if (isEmpty()) { cout "Queue Underflow!!\n" endl; return ; } // Deque has only one element if (front == rear) { front = -1; rear = -1; } else // back to initial position if (front == size -1) front = 0; else // remove current front value from Deque;increment front by 1 front = front+1; } // Delete element at rear end of Deque void Deque::deleterear() { if (isEmpty()) { cout " Underflow!!\n" endl ; return ; } // Deque has only one element if (front == rear) { front = -1; rear = -1; } else if (rear == 0) rear = size-1; else rear = rear-1; } // retrieve front element of Deque int Deque::getFront() { if (isEmpty()) { cout " Underflow!!\n" endl; return -1 ; } return array[front]; } // retrieve rear element of Deque int Deque::getRear() { if(isEmpty() || rear 0) { cout " Underflow!!\n" endl; return -1 ; } return array[rear]; } //main program int main() { Deque dq(5); cout "Insert element 1 at rear end \n"; dq.insertrear(1); cout "insert element 3 at rear end \n"; dq.insertrear(3); cout "rear element of deque " " " dq.getRear() endl; dq.deleterear(); cout "After deleterear, rear = " dq.getRear() endl; cout "inserting element 5 at front end \n"; dq.insertfront(5); cout "front element of deque " " " dq.getFront() endl; dq.deletefront(); cout "After deletefront, front = " dq.getFront() endl; return 0; }
Гаралт:
1 элементийг арын элемент deque 3
Устгасны дараа арын =
урд хэсэгт 5-р элементийг оруулах
deque 5-ын урд элемент
Устгасны дараа урд =
Java Deque Implementation
Java дахь deque интерфейс болох “java.util.Deque” нь “java.util.Queue” интерфейсээс гаралтай. Deque-г дараалал (Эхлээд орж, эхлээд гарна) эсвэл стек (хамгийн сүүлд орж, эхлээд гарна) болгон ашиглаж болно. Эдгээр хэрэгжүүлэлт нь холбосон жагсаалтаас илүү хурдан ажилладаг.
Доор өгөгдсөн бол Java хэл дээрх Deque интерфейсийн шатлал юм.
Java дахь Deque интерфейсийн талаар бид хэд хэдэн зүйлийг санах хэрэгтэй:
- Гадаад синхрончлол байхгүй тул хэрэгжилт нь урсгалд аюулгүй биш юм.
- Deque биш юм. олон урсгалаар зэрэгцэн ажиллахыг дэмжинэ.
- Масив ашиглан хэрэгжүүлсэн Deque нь NULL элементүүдийг ашиглахыг зөвшөөрдөггүй.
- Хязгаарлалтгүй багтаамж, хэмжээг өөрчлөх боломжтой массивын дэмжлэгтэйгээр массивууд шаардлагын дагуу өсөх боломжтой. хамгийн чухал хоёр онцлог юм.
Дараах нь Deque интерфейсээр дэмжигддэг төрөл бүрийн аргууд:
No. | Арга | Тодорхойлолт |
---|---|---|
1 | add(element) | Сүүлд элемент нэмнэ. |
2 | addFirst(element) | Элементийгтолгой/урд. |
3 | addLast(элемент) | Сүүл/арын хэсэгт элемент нэмнэ. |
4 | offer(element) | Сүүлд элемент нэмнэ; Оруулга амжилттай болсон эсэхийг харуулах логик утгыг буцаана. |
5 | offerFirst(element) | Толгой дээр элемент нэмнэ; Оруулга амжилттай болсон эсэхийг харуулах логик утгыг буцаана. |
6 | offerLast(element) | Сүүлд элемент нэмнэ; Оруулга амжилттай болсон эсэхийг харуулах логикийн утгыг буцаана. |
7 | iteter() | Deque-ийн давталтыг буцаана. |
8 | descendingIterator() | Энэ декийн урвуу дараалалтай давтагчийг буцаана. |
9 | push(элемент) | Дэлгэцийн толгойд элемент нэмнэ. |
10 | pop(element) | Дэлгэцийн толгойноос элементийг хасаад буцаана. |
11 | removeFirst() | Элементийг устгана. deque-ийн толгой. |
12 | removeLast() | Декийн сүүлний элементийг устгана. |
13 | санал асуулга() | Дэлгэцийн эхний элементийг авч, устгана(деке-ийн тэргүүнээр төлөөлдөг); Хэрэв deque хоосон бол NULL буцаана. |
14 | pollFirst() | Энэ деке-ийн эхний элементийг авч устгана; Хэрэв энэ deque бол null буцаанахоосон. |
15 | pollLast() | Энэ deque-ийн сүүлчийн элементийг авч, устгана; Хэрэв энэ deque хоосон байвал null буцаана. |
16 | peek() | Төлөөлөгдсөн дарааллын толгойг (деке-ийн эхний элемент) авна. энэ зарчмаар; Хэрэв энэ deque хоосон байвал null буцаана. Тэмдэглэл: Энэ үйлдэл нь элементийг устгадаггүй. |
17 | peekFirst() | Энэ deque-ийн эхний элементийг олж авна; Хэрэв энэ deque хоосон байвал null буцаана. Тэмдэглэл: Энэ үйлдэл нь элементийг устгадаггүй. |
18 | peekLast() | Энэ деквийн сүүлчийн элементийг татах, эсвэл хоосон бол null буцаана. Тэмдэглэл: Энэ үйлдэл нь элементийг устгадаггүй. |
Дараах Java хэрэгжүүлэлт нь дээр дурдсан янз бүрийн үйлдлүүдийг харуулж байна.
import java.util.*; class Main { public static void main(String[] args) { Dequedeque = new LinkedList (); // We can add elements to the queue in various ways deque.add(1); // add to tail deque.addFirst(3); deque.addLast(5); deque.push(7); //add to head deque.offer(9); deque.offerFirst(11); deque.offerLast(13); System.out.println("The deque : " + deque + "\n"); // Iterate through the queue elements. System.out.println("Standard Iterator"); Iterator iterator = deque.iterator(); while (iterator.hasNext()) System.out.print(" " + iterator.next()); // Reverse order iterator Iterator reverse = deque.descendingIterator(); System.out.println("\nReverse Iterator"); while (reverse.hasNext()) System.out.print(" " + reverse.next()); // Peek returns the head, without deleting // it from the deque System.out.println("\n\nPeek " + deque.peek()); System.out.println("After peek: " + deque); // Pop returns the head, and removes it from // the deque System.out.println("\nPop " + deque.pop()); System.out.println("After pop: " + deque); // We can check if a specific element exists // in the deque System.out.println("\nContains element 3?: " + deque.contains(3)); // We can remove the first / last element. deque.removeFirst(); deque.removeLast(); System.out.println("Deque after removing " + "first and last elements: " + deque); } }
Гаралт:
Deque : [11, 7, 3, 1, 5, 9, 13]
Стандарт давтагч
11 7 3 1 5 9 13
Урвуу давтагч
13 9 5 1 3 7 1
11 -
Харсаны дараа: [11, 7, 3, 1, 5, 9, 13]
Поп 11
Поп дарсны дараа: [7, 3, 1, 5, 9, 13]
нь
*>
Дээрх программ дээр бид Java-ийн Deque интерфэйсийг ашигласан ба бүхэл тоон элементийн deque-г тодорхойлсон. Дараа нь бид энэ deque дээр янз бүрийн үйлдлүүд хийж, эдгээр үйлдлүүдийн үр дүнг гаргавхаруулав.
Програмууд
Deque-г дараах програмуудын заримд ашиглаж болно.
#1) Хуваарийн алгоритм: Хуваарийн алгоритм болох "Хулгайлах хуваарийн алгоритм" нь олон процессорын систем дэх янз бүрийн процессоруудад зориулсан ажлын хуваарийг хэрэгжүүлдэг. Энэ хэрэгжүүлэлт нь deque ашигладаг бөгөөд процессор нь гүйцэтгэлд зориулж deque-ээс эхний элементийг авдаг.
#2) Үйлдлийн жагсаалтыг буцаах: Програм хангамжийн программуудад бидэнд олон үйлдэл байдаг. Нэг нь "буцах". Бид буцаах үйлдлийг олон удаа хийх үед эдгээр бүх үйлдлүүд жагсаалтад хадгалагдана. Энэ жагсаалтыг бид дурын төгсгөлөөс хялбархан оруулах/хасах боломжтой болгох үүднээс хадгалагдсан болно.
#3) Хэсэг хугацааны дараа оруулгуудыг устгах: Програмыг шинэчлэх хувьцааны бүртгэлийг жагсаасан програмууд гэх мэт жагсаалтад байгаа оруулгууд. Эдгээр програмууд хэсэг хугацааны дараа оруулгуудыг устгаж, мөн шинэ оруулгуудыг оруулна. Үүнийг deque ашиглан хийдэг.
Дүгнэлт
Deque нь дарааллын урд болон хойд хоёр талын төгсгөлд элементүүдийг нэмэх/хасах боломжийг олгодог хоёр төгсгөлтэй дараалал юм. Deque-г массив эсвэл холбосон жагсаалт ашиглан хэрэгжүүлж болно. Гэсэн хэдий ч бидэнд Deque-ийн янз бүрийн үйлдлүүдийг хэрэгжүүлдэг Standard Template Library (STL) анги бас бий.
Java-д бид Deque-г хэрэгжүүлэхийн тулд дарааллын интерфейсээс өвлөн авсан Deque интерфейстэй. Deque-ийн үндсэн стандарт үйлдлүүдээс гадна энэ интерфэйс нь янз бүрийн функцийг дэмждэгDeque дээр хийж болох бусад үйлдлүүд.
Deque нь ерөнхийдөө хоёр төгсгөлд элемент нэмэх/хасах шаардлагатай програмуудад ашиглагддаг. Энэ нь мөн олон процессортой систем дэх процессоруудын хуваарь гаргахад ихэвчлэн ашиглагддаг.
С++ сургалтын иж бүрэн цувралыг үзээрэй