*이 글은 2022년 1월~2월 노션으로 진행한 스터디를 옮긴 글입니다.
front가 가리키는 값은 가장 앞 원소의 앞
연결리스트 구현 시 front는 가장 앞 원소를 가리키므로 두 방식에 차이가 있음
#include<iostream>
using namespace std;
const int max_queue=100;
int Queue[max_queue];
int front, rear;
void init() {
front = rear = -1;
}
bool is_empty_queue() {
if (front == rear) {
return true;
}
else return false;
}
bool is_full() {
if (rear == max_queue - 1) return true;
else return false;
}
void enQueue(int data) {
if(is_full()){
cout << "큐가 꽉 찼습니다," << endl;
}
else{
Queue[++rear] = data;
}
}
int deQueue() {
if(is_empty_queue()){
cout << "빈 큐입니다." << endl;
exit(-1);
}
else {
return Queue[++front];
}
}
int peek() {
if (is_empty_queue()) {
cout << "빈 큐입니다." << endl;
}
else {
return Queue[front];
}
}
void print_queue() {
for (int i = front+1; i <= rear; i++) {
cout << Queue[i] << endl;
}
}
int main() {
init();
enQueue(10);
enQueue(20);
enQueue(30);
print_queue(); cout<< endl;
deQueue();
print_queue();
return 0;
}
#include<iostream>
using namespace std;
class Node {
public:
int data;
Node* link;
};
Node* rear;
Node* front;
void init() {
front = rear = NULL;
}
bool is_empty_queue() {
return(front == NULL);
}
void enQueue(int data) {
Node* new_node=new Node;
new_node->data = data;
new_node->link = NULL;
if (is_empty_queue()) {
front = new_node;
rear = new_node;
}
else {
rear->link = new_node;
rear = new_node;
}
}
void deQueue() {
if (is_empty_queue()) {
cout << "공백 리스트입니다." << endl;
}
else {
front = front->link;
if (is_empty_queue()) {
rear = NULL;
}
}
}
void print_queue() {
for (Node* i = front; i != NULL; i=i->link) {
cout << i->data << endl;
}
}
int main() {
init();
enQueue(10);
enQueue(20);
enQueue(30);
print_queue();
deQueue();
print_queue();
}
큐의 변형-원형큐
원형큐 사용 이유
원형큐의 상태 판별
출력 연산시 주의점
- 만약 front보다 rear가 앞에 있다면?
- 해결방법: 나눠서 출력(front~max_array/0~rear)
#include<iostream>
using namespace std;
const int max_array = 5;
int Queue[max_array];
int front, rear;
//초기화
void init() {
front = rear = 0;
}
//공백상태
bool is_empty_queue() {
return(front == rear);
}
//포화상태(자료를 M-1개 사용하는 경우)
bool is_full_queue() {
return(front == (rear + 1) % max_array);
}
//삽입
void enQueue(int data) {
if (is_full_queue()) {
cout << "error: full_queue_insert" << endl;
}
else {
rear = (rear + 1) % max_array;
Queue[rear] = data;
}
}
//삭제(단순삭제)
void deQueue() {
if (is_empty_queue()) {
cout << "error: empty_queue_delete" << endl;
}
else {
front = (front + 1) % max_array;
}
}
//피크
int peek() {
if (is_empty_queue()) {
cout << "error: empty_queue_peek" << endl;
exit(1);
}
else {
return(Queue[rear]);
}
}
//출력
void print_queue() {
if (is_empty_queue()) {
cout << "error: empty_queue_print" << endl;
}
else {
if (front <= rear) {
for (int i = front + 1; i <= rear; i++) {
cout << Queue[i] << " ";
}
cout << endl << "마지막 큐입니다." << endl;
}
else {
for (int i = front + 1; i < max_array; i++) {
cout << Queue[i] << " ";
}
for (int i = 0; i <= rear; i++) {
cout << Queue[i] << " ";
}
cout << endl << "마지막 큐입니다." << endl;
}
}
}
int main() {
init();
enQueue(10);
enQueue(20);
enQueue(30);
enQueue(40);
print_queue();
deQueue();
deQueue();
print_queue();
enQueue(60);
enQueue(70);
print_queue();
return 0;
}
큐의 변형-덱
Double-Ended Queue
큐의 양쪽 끝에서 삽입과 삭제가 모두 발생할 수 있음
#include <iostream>
#include <deque>
using namespace std;
deque<int> deq;
int main() {
int n;
cin >> n;
while (n--) {
char ch[15];
cin >> ch;
if (ch[0] == 'p' && ch[1] == 'u') {
int data;
cin >> data;
if (ch[5] == 'f') {
deq.push_front(data);
}
else {
deq.push_back(data);
}
}
else if (ch[0] == 'p' && ch[1] == 'o') {
int data;
if (ch[4] == 'f') {
if (deq.empty()) cout << "-1" << '\n';
else {
data = deq.front();
deq.pop_front();
cout << data << '\n';
}
}
else {
if (deq.empty()) cout << "-1" << '\n';
else {
data = deq.back();
deq.pop_back();
cout << data << '\n';
}
}
}
else if (ch[0] == 's') {
cout << deq.size() << '\n';
}
else if (ch[0] == 'e') {
if (deq.empty()) cout << '1' << '\n';
else cout << '0' << '\n';
}
else if (ch[0] == 'f') {
if (deq.empty()) cout << "-1" << '\n';
else cout << deq.front() << '\n';
}
else if (ch[0] == 'b') {
if (deq.empty()) cout << "-1" << '\n';
else cout << deq.back() << '\n';
}
}
return 0;
}
#include<iostream>
#include<string>
#include<queue>
using namespace std;
string input;
deque<char> q;
int N, K;
void delWithBig() {
// 문자열 input를 순회하면서
for (int i = 0; i < input.length(); i++) {
// 삭제할게 있는데, 덱에 있는것보다 input[i]가 크면 덱에 요소 삭제
while (K && !q.empty() && q.back() < input[i]) {
q.pop_back();
K--;
}
q.push_back(input[i]);
}
// 삭제할게 남았으면 덱에서 그 만큼 덜 출력
for (int i = 0; i < q.size() - K; i++)
cout << q[i];
}
int main() {
cin >> N >> K;
cin >> input;
delWithBig();
}