You are on page 1of 17

HW3:環形佇列(加入 PushBack,PushFront,PopBack,PopFront 功能)

學號: CA365115
輸出結果:

C++ code(截圖版):
.h 檔:
主程式:
C++ code(原始版):
.h 檔:
#pragma once
#include<iostream>
#include<stdlib.h>
#include<iomanip>
using namespace std;
template<class T>
class Queue
{
private:
unsigned int m_head;
unsigned int m_tail;
unsigned int m_max_size;
unsigned int m_size;
public:
Queue();
~Queue();
bool SetSize(unsigned int size);
bool Push(T value);
bool PushFront(T value);
bool PushBack(T value);
bool Pop(T& value);
bool PopFront(T& value);
bool PopBack(T& value);
bool insert(int position, T value);
bool remove(int position);
T* m_elements;
};
template<class T>
Queue<T>::Queue()
:m_head(0)
,m_tail(0)
,m_max_size(0)
,m_size(0)
,m_elements(NULL)
{
}
template<class T>
Queue<T>::~Queue()
{
}
template<class T>
bool Queue<T>::SetSize(unsigned int size)
{
if (m_elements)
delete[]m_elements;
m_elements = new T[size];
if (!m_elements)
return false;
m_max_size = size;
return true;
}
template<class T>
bool Queue<T>::PushFront(T value)
{
if (m_size == m_max_size)
{
return false;
}
if (m_head<=0)
{
m_head = m_max_size;
m_elements[--m_head] = value;
}
else
{
m_elements[--m_head] = value;
}
m_size++;
return true;
}
template<class T>
bool Queue<T>::PushBack(T value)
{
if (m_size == m_max_size)
{
return false;
}
if (m_tail >= m_max_size)
{
m_tail = 0;
m_elements[m_tail++] = value;
}
else
{
m_elements[m_tail++] = value;
}
m_size++;
return true;
}
template<class T>
bool Queue<T>::Push(T value)
{
if (m_size == m_max_size)
{
return false;
}
if (m_tail >= m_max_size)
{
m_tail = 0;
m_elements[m_tail++] = value;
}
else
{
m_elements[m_tail++] = value;
}
m_size++;
return true;
}
template<class T>
bool Queue<T>::Pop(T& value)
{
if (m_size == 0)
{
return false;
}

if (m_head >= m_max_size)


{
m_head = 0;
value = m_elements[m_head++];
}
else
{
value = m_elements[m_head++];
}
m_size -= 1;
return true;
}
template<class T>
bool Queue<T>::PopFront(T& value)
{
if (m_size == 0)
{
return false;
}

if (m_head >= m_max_size)


{
m_head = 0;
value = m_elements[m_head++];
}
else
{
value = m_elements[m_head++];
}
m_size -= 1;
return true;
}
template<class T>
bool Queue<T>::PopBack(T& value)
{
if (m_size == 0)
{
return false;
}

if (m_tail >= m_max_size)


{
m_tail -= m_max_size;
value = m_elements[--m_tail];
}
else
{
value = m_elements[--m_tail];
}
m_size -= 1;
return true;
}
template<class T>
bool Queue<T>::insert(int position, T value)
{
for (int i = m_size; i >= position; --i)
{
m_elements[i + 1] = m_elements[i];
}
m_elements[position] = value;

return true;
}
template<class T>
bool Queue<T>::remove(int position)
{
for (int i = position; i < m_size; ++i)
{
m_elements[i] = m_elements[i + 1];
}
return true;
}

主程式:
#include <iostream>
#include<iomanip>
#include<time.h>
#include"Queue.h"
using namespace std;
int main()
{
srand(time(NULL));
int size;
int val;
cout << "請輸入容器大小:";
cin >> size;
Queue<int>queue;
queue.SetSize(size);
cout << "BackPush" << endl;
for (int i = 0; i < size/2+5 ; ++i)
{
val = rand() % 100;
if (queue.PushBack(val))
{
cout << setw(2) << val << " ";
}
else
{
cout << "環形推入失敗" << " ";
}
if (i % 10 == 9)
{
cout << endl;
}
}
cout << endl;
cout << "FrontPush" << endl;
for (int i = 0; i < size/2-5; ++i)
{
val = rand() % 100;
if (queue.PushFront(val))
{
cout << setw(2) << val << " ";
}
else
{
cout << "環形推入失敗" << " ";
}
if (i % 10 == 9)
{
cout << endl;
}
}
cout << endl;
cout << "推入後的佇列為:" << endl;
for (int i = size/2+5; i < size ; ++i)
{
cout << queue.m_elements[i] << " ";
}
for (int i = 0; i < size/2+5; ++i)
{
cout << queue.m_elements[i] << " ";
}
cout << endl;
cout <<"//////////////////////////////////////////////////"<< endl;
cout << "FrontPop" << endl;
for (int i = 0; i < size/2; ++i)
{
if (queue.PopFront(val))
{
cout << setw(2) << val << " ";
}
else
{
cout << "取出失敗" << " ";
}
if (i % 10 == 9)
{
cout << endl;
}
}
cout << endl;
cout << "PopFront後的佇列為:" << endl;
for (int i = 5; i < size/2+5; ++i)
{
cout << queue.m_elements[i] << " ";
}
cout << endl;
cout << "BackPop" << endl;
for (int i = 0; i < size / 4; ++i)
{
if (queue.PopBack(val))
{
cout << setw(2) << val << " ";
}
else
{
cout << "取出失敗" << " ";
}
if (i % 10 == 9)
{
cout << endl;
}
}
cout << endl;
cout << "PopBack後的佇列為:" << endl;
for (int i = 5; i < size/4+5; ++i)
{
cout << queue.m_elements[i] << " ";
}
cout << endl;
}

You might also like