수색…


대기열 소개

큐는 FIFO (first-in, first-out) 데이터 구조입니다. 즉, 큐에 추가 된 첫 번째 요소는 제거 된 첫 번째 요소입니다 ( "first out").

도움을 기다리는 고객의 사례를 생각해 봅시다. Alice, Bob, Dan은 모두 슈퍼마켓에 있습니다. Alice는 지불 할 준비가되어 있으므로 계산원에 접근합니다. Alice가 대기열에 있습니다. 그녀는 대기열에있는 유일한 사람이므로 그녀는 앞과 뒤에 모두 있습니다.

이제 대기열은 다음과 같습니다.

              |-------|
              | Alice | cashier
              |-------|
                ▲   ▲
back of queue ──┘   └── front of queue

이제 Bob과 Dan은 계산원에 접근합니다. 큐에 추가됩니다. 앨리스는 여전히 앞쪽에 있고, 댄은 뒤쪽에 있습니다.

              |-------||-------||-------|
              |  Dan  ||  Bob  || Alice | cashier
              |-------||-------||-------|
                ▲                     ▲
back of queue ──┘                     └── front of queue

대기열에 사람을 추가하는 것은 대기열 작업입니다. Alice, Bob 및 Dan이 대기열에 추가되었습니다. 출납원이 각 고객에게 도움을 주면 대기열에서 제거됩니다. 이것은 큐 꺼내기 작업입니다. 대기열의 데이터 요소를 나타내는 고객은 대기열의 전면에서 대기열에서 제외됩니다. 이것은 점원에게 접근 한 첫 번째 고객이 첫 번째 고객 (FIFO)임을 의미합니다.

배열을 사용하여 큐 구현.

도입부에서 언급 한대로 FIFO를 따르십시오. 5 가지 주요 작업 :

  1. Enqueue (x) : x를 큐의 뒤쪽으로 푸시합니다.
  2. Dequeue () : 큐의 앞쪽에서 요소를 팝합니다.
  3. isEmpty () : 큐가 비어 있는지 여부를 찾습니다.
  4. isFull () : 큐가 가득 차 있는지 여부를 찾습니다.
  5. frontValue () : 큐의 전면 값을 반환합니다.

모든 연산은 일정한 O (1) 시간입니다.

코드 :

#include<stdio.h>

#define MAX 4

int front = -1;
int rear = -1;
int a[MAX];

bool isFull() {
  if(rear == MAX-1)
    return true;
  else
    return false;    
}

bool isEmpty() {
  if(rear == -1 && front==-1)
    return true;
  else
    return false;    
}

void enqueue(int data) {
  if (isFull()){
    printf("Queue is full\n");
    return;
  } else if(isEmpty()) {
    front = rear =0;
  } else {
    rear = rear + 1;
    a[rear] = data;      
  }
}
    
void deque(){
  if(isEmpty()){
    printf("Queue is empty\n");
    return;
  } else if(front == rear) {
    front =-1;
    rear =-1;
  } else {
    front = front + 1;
  }
}
    
void print(){
  printf("Elements in Queue are\n");  
  for(int i = front;i<=rear;i++){
    printf("%d ",a[i]);
  }
  printf("\n");
}

int frontValue(){  
  printf("The front element after set of enqueue and dequeue is %d\n", a[front]);
}

int main(){
  deque();     // Queue is empty message will be thrown
  enqueue(10);
  print();
  enqueue(20);
  print();
  enqueue(30);
  print();
  enqueue(40);
  frontValue();
  print();
  enqueue(50);
  frontValue();
  deque();
  deque();
  enqueue(50);
  frontValue();
  print();                    
  return 0;
}

순환 큐의 구현

메모리는 선형 큐와 비교하여 순환 큐에서 효율적으로 구성됩니다.

선형 대기열에서 :

여기에 이미지 설명을 입력하십시오.

순환 대기열에서

여기에 이미지 설명을 입력하십시오.

남은 공간을 사용할 수 있습니다.

동일한 작업 수행을위한 코드 :

#include<stdio.h>
#define MAX 10000
int front = -1;
int rear = -1;
int a[MAX]; 


bool isFull() {
  if((rear+1) % MAX == front)
    return true;
  else
    return false;    
}

bool isEmpty() {
  if(rear == -1 && front==-1)
    return true;
  else
    return false;    
}

void enqueue(int data) {
  if (isFull()){
    printf("Queue is full\n");
    return;
  } else if(isEmpty()) {
    front = rear = 0;
  } else {
    rear = (rear+1) % MAX;
    a[rear] = data;
  }
}

void deque() {
  if(isEmpty()){
    printf("Queue is empty\n");
    return;
  } else if(front == rear) {
    front =-1;
    rear =-1;
  } else {
    front = (front+1) % MAX;
  }
}

int frontValue() {
  return(a[front]);
}

int main() {   
  deque(); 
  enqueue(10);
  enqueue(20);
  enqueue(30);       
  enqueue(40);
  enqueue(50);
  frontValue();
  return 0;
}

모든 연산에는 O (1) 시간 복잡도가 있습니다.

대기열의 연결된 목록 표현

링크 된리스트 표현은 메모리 관리 측면에서보다 효율적입니다.

O (1) 시간에 Linklist를 사용하여 대기열에 대기열 및 대기열을 표시하는 코드입니다.

#include<stdio.h>
#include<malloc.h>

struct node{
    int data;
    node* next;
};

node* front = NULL;
node* rear = NULL;

void enqueue(int data){      //adds element to end
    
    struct node* temp = (struct node*)malloc(sizeof(struct node*));
    temp->data = data;
    temp->next =NULL;
    
    if(front== NULL && rear == NULL){
        front = rear = temp;
        return;
    }
    rear->next = temp;
    rear= temp;
}

void deque(){     //removes element from front
    node* temp = front;
    
    if(front== NULL && rear == NULL){
        return;
    }
    else if (front==rear){
        front =rear = NULL;
    }
    else
    front= front ->next;
    
    free(temp);
}

void print(){
    node* temp = front;
    
    for(; temp != rear; temp=temp->next){
        printf("%d ",temp->data);
    }
    //for printing the rear element
    
        printf("%d ",temp->data);
    printf("\n");
}



int main(){
    
    enqueue(20);
    enqueue(50);
        enqueue(70);
        printf("After set of enques\n");
        print();
        
        deque();
        printf("After 1 deque\n");    
        print();
        
        return 0;    
    
    
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow