Radhë me fund të dyfishtë (Deque) në C++ me shembuj

Një tutorial i thelluar mbi Deque ose Radhën me dy përfundime në C++. Tutoriali shpjegon Çfarë është Deque, Operacionet Bazë, C++ & Zbatimi dhe aplikacionet e Java:

Radha me fund të dyfishtë ose e quajtur thjesht "Deque" është një version i përgjithësuar i Radhës.

Dallimi midis Radhës dhe Deque është se ai nuk ndjek FIFO Qasja (First In, First Out). Karakteristika e dytë e Deque është se ne mund të futim dhe heqim elementë nga skajet e përparme ose të pasme.

Klasifikimi i radhës me fund të dyfishtë

Deque mund të klasifikohet si më poshtë:

Input-restricted Deque: Në hyrje të kufizuar, fshirja mund të bëhet nga të dy skajet, por futja mund të bëhet vetëm në fundin e pasmë të radha.

Deque e kufizuar në dalje: Në radhën e kufizuar me dalje, futja mund të bëhet nga të dy skajet, por fshirja bëhet vetëm në njërin skaj, pra në pjesën e përparme të radhës.

Ne gjithashtu mund të implementojmë rafte dhe radhë duke përdorur deque.

Operacionet bazë të Deque

Më poshtë janë operacionet bazë që mund të kryhen në deque.

  • fut pjesën e përparme: Fut ose shto një artikull në pjesën e përparme të fletës.
  • insertLast: Fut ose shto një artikull në pjesa e pasme e kutisë.
  • deleteFront: Fshi ose hiq artikullin nga pjesa e përparme e radhës.
  • fshi të fundit: Fshi ose hiq artikulli nga pjesa e pasme eradha.
  • getFront: Rmerr artikullin e përparmë në deque.
  • getLast: Rmerr artikullin e fundit në radhë.
  • GetLast. 10> isEmpty: Kontrollon nëse deku është bosh.
  • isFull: Kontrollon nëse deku është plot.

Deque Illustration

Një dekë bosh përfaqësohet si më poshtë:

Më pas, futim elementin 1 në pjesën e përparme.

Tani, ne fusim elementin 3 në pjesën e pasme.

Më pas, ne shtojmë elementin 5 në pjesën e përparme dhe kur të rritet, pikat e përparme në 4.

Më pas, fusim elementët 7 në pjesën e pasme dhe 9 në pjesën e përparme. Deku do të duket si tregohet më poshtë.

Më pas, le të heqim një element nga pjesa e përparme.

Kështu, shohim se kur elementet futen në pjesën e përparme, pozicioni i përparmë zvogëlohet ndërsa rritet kur hiqet një element. Për pjesën e pasme, pozicioni rritet për futje dhe zvogëlohet për heqje .

Implementimi Deque

Zbatimi i Deques C++

Ne mund të zbatojmë një deque në C++ duke përdorur vargje si dhe një listë të lidhur. Përveç kësaj, Standard Template Library (STL) ka një klasë "deque" e cila zbaton të gjitha funksionet për këtë strukturë të të dhënave.

Zbatimi i grupit të deque është dhënë më poshtë. Duke qenë se është një radhë me dy skaje, ne kemi përdorur vargje rrethore për tëzbatimi.

#include using 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; }

Dalja:

Fut elementin 1 në fundin e pasmë

fut elementin 3 në fundin e pasmë

elementin 1 në fundin e pasmë të deque  3

Pas deleterear, rear =

futja e elementit 5 në pjesën e përparme

elementi i përparmë e deque  5

Pas deletefront, front =

Zbatimi i Java Deque

Ndërfaqja deque në Java, "java.util.Deque" rrjedh nga ndërfaqja "java.util.Queue". Deque mund të përdoret si një radhë (First In, First Out) ose një pirg (Last In, First Out). Këto implementime funksionojnë më shpejt se lista e lidhur.

Duke dhënë më poshtë është hierarkia për ndërfaqen Deque në Java.

Duhet të mbajmë mend disa pika në lidhje me ndërfaqen Deque në Java:

  • Zbatimi nuk është i sigurt në fije pasi nuk ka sinkronizim të jashtëm.
  • Deque nuk ka mbështesin konkurencën nga fije të shumta.
  • Deque të zbatuara duke përdorur vargje nuk lejojnë përdorimin e elementeve NULL.
  • Vargjet lejohen të rriten sipas kërkesave, me kapacitet pa kufizime dhe mbështetje të grupeve të ndryshueshme duke qenë dy veçoritë më të rëndësishme.

Në vijim janë metodat e ndryshme të mbështetura nga ndërfaqja Deque:

Nr. Metoda Përshkrim
1 shto(element) Shton një element në bisht.
2 addFirst(element) Shton një element nëkoka/para.
3 addLast(element) Shton një element në bisht/mbrapa.
4 oferta(element) Shton një element në bisht; kthen një vlerë boolean për të treguar nëse futja ishte e suksesshme.
5 offerFirst(element) Shton një element në kokë; kthen një vlerë boolean për të treguar nëse futja ishte e suksesshme.
6 offerLast(element) Shton një element në bisht; kthen një vlerë boolean për të treguar nëse futja ishte e suksesshme.
7 iterator() Kthen një përsëritës për deque.
8 decendingIterator() Kthen një përsëritës që ka rendin e kundërt për këtë deque.
9 push(element) Shton një element në kokën e deqeve.
10 pop(element) Heq një element nga kreu i deques dhe e kthen atë.
11 removeFirst() Heq elementin në koka e dekës.
12 removeLast() Heq elementin në fund të dekës.
13 poll() Rikjen dhe heq elementin e parë të deques (përfaqësuar nga kreu i deque); kthen NULL nëse deque është bosh.
14 pollFirst() Rikjen dhe heq elementin e parë të kësaj deque; kthehet null nëse kjo deque ështëbosh.
15 pollLast() Rik dhe heq elementin e fundit të kësaj deke; kthen null nëse kjo deque është e zbrazët.
16 peek() Rimer kokën(elementin e parë të deque) të radhës së përfaqësuar nga kjo dekë; kthen null nëse kjo deque është bosh.

Shënim: Ky operacion nuk e heq elementin.

17 peekFirst() Rik elementin e parë të kësaj deke; kthen null nëse ky deque është bosh.

Shënim: Ky operacion nuk e heq elementin.

18 peekLast() Rik elementin e fundit të kësaj deke, ose e kthen null nëse kjo dekë është bosh.

Shënim: Ky operacion nuk e heq elementin.

Zbatimi i mëposhtëm Java demonstron operacionet e ndryshme të diskutuara më sipër.

 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); } }

Outputi:

Deque : [11, 7, 3, 1, 5, 9, 13]

Iterator standard

11 7 3 1 5 9 13

Iterator i kundërt

13 9 5 1 3 7 1

Shikoni 11

Pas shikimit: [11, 7, 3, 1, 5, 9, 13]

Pop 11

Pas pop: [7, 3, 1, 5, 9,>

Në programin e mësipërm, ne kemi përdorur ndërfaqen Deque të Java dhe kemi përcaktuar një deque elementësh të plotë. Më pas kemi kryer operacione të ndryshme në këtë dekë dhe nxjerrim rezultatet e këtyre operacioneveshfaqet.

Aplikimet

Deque mund të përdoret në disa nga aplikacionet e mëposhtme.

#1) Algoritmi i planifikimit: Një algoritëm planifikimi, "A-steal scheduling algorithm" zbaton planifikimin e detyrave për procesorë të ndryshëm në sistemin shumëprocesorësh. Ky implementim përdor deque dhe procesori merr elementin e parë nga deque për ekzekutim.

#2) Zhbër listën e aktiviteteve: Në aplikacionet softuerike, ne kemi shumë veprime. Njëra është "zhbëj". Kur kemi kryer shumë herë veprimin e zhbërjes, të gjitha këto veprime ruhen në një listë. Kjo listë ruhet si deque në mënyrë që ne të mund të shtojmë/heqim me lehtësi hyrjet nga çdo fund.

#3) Hiqni hyrjet pas njëfarë kohe: Aplikacionet rifreskohen hyrjet në listën e tyre si aplikacionet që listojnë hyrjet e aksioneve, etj. Këto aplikacione heqin hyrjet pas njëfarë kohe dhe gjithashtu futin hyrje të reja. Kjo bëhet duke përdorur një deque.

Përfundim

Deque është një radhë me dy skaje që na lejon të shtojmë/heqim elementë nga të dy skajet, pra nga pjesa e përparme dhe e pasme, e radhës. Deque mund të zbatohet duke përdorur vargje ose lista të lidhura. Megjithatë, ne kemi gjithashtu një klasë Standard Template Library (STL) e cila zbaton operacionet e ndryshme të Deque.

Në Java, ne kemi një ndërfaqe Deque që trashëgohet nga ndërfaqja e radhës për të zbatuar Deque. Përveç operacioneve standarde bazë të Deque, kjo ndërfaqe mbështet të ndryshmeoperacione të tjera që mund të kryhen në Deque.

Deque zakonisht përdoret për aplikacione që kërkojnë shtimin/heqjen e elementeve nga të dy skajet. Gjithashtu përdoret më së shumti në planifikimin e procesorëve në sistemet me shumë procesorë.

Shiko serinë e plotë të trajnimit C++

Lëviz në Krye