Skip to content

Commit c1682e8

Browse files
committed
Create link_queue.hpp
1 parent 2021090 commit c1682e8

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

Queue/LinkQueue/link_queue.hpp

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
/*
2+
@Author:Jie Mo
3+
@Email:582865471@vip.qq.com
4+
@Github:www.github.com/JieTrancender
5+
@Time:20th October
6+
*/
7+
8+
#include "stdafx.h"
9+
#include "my_queue.h"
10+
#include "chain_node.hpp"
11+
#include <iostream>
12+
#include <sstream>
13+
14+
//MLQ stand for My Link Queue
15+
namespace MLQ
16+
{
17+
template <typename anytype>
18+
class LinkQueue : public MLQ::MyQueue<anytype>
19+
{
20+
public:
21+
LinkQueue(int initial_capacity = 10);
22+
~LinkQueue();
23+
24+
//抽象类ADT方法
25+
bool empty() const;
26+
int size() const;
27+
anytype & front();
28+
anytype & back();
29+
void pop();
30+
void push(const anytype &element);
31+
32+
private:
33+
MLQ::ChainNode<anytype> *m_queue_front;
34+
MLQ::ChainNode<anytype> *m_queue_back;
35+
int m_queue_size;
36+
};
37+
38+
//函数功能:构造函数
39+
template <typename anytype>
40+
LinkQueue<anytype>::LinkQueue(int initial_capacity)
41+
{
42+
m_queue_front = nullptr;
43+
m_queue_back = nullptr;
44+
m_queue_size = 0;
45+
}
46+
47+
//函数功能: 析构函数
48+
template <typename anytype>
49+
LinkQueue<anytype>::~LinkQueue()
50+
{
51+
while (m_queue_front != nullptr)
52+
{
53+
MLQ::ChainNode<anytype> *next_node = m_queue_front->next;
54+
delete m_queue_front;
55+
m_queue_front = next_node;
56+
}
57+
}
58+
59+
//函数功能: 判断队列是否为空
60+
template <typename anytype>
61+
bool LinkQueue<anytype>::empty() const
62+
{
63+
return m_queue_front == nullptr;
64+
}
65+
66+
//函数功能: 返回队列元素个数
67+
template <typename anytype>
68+
int LinkQueue<anytype>::size() const
69+
{
70+
return m_queue_size;
71+
}
72+
73+
//函数功能: 返回队列首元素的引用
74+
template <typename anytype>
75+
anytype & LinkQueue<anytype>::front()
76+
{
77+
if (0 == m_queue_size)
78+
{
79+
std::ostringstream os;
80+
os << "The queue is empty .";
81+
throw os.str();
82+
}
83+
return m_queue_front->element;
84+
}
85+
86+
//函数功能: 返回队尾元素的引用
87+
template <typename anytype>
88+
anytype & LinkQueue<anytype>::back()
89+
{
90+
if (0 == m_queue_size)
91+
{
92+
std::ostringstream os;
93+
os << "The queue is empty .";
94+
throw os.str();
95+
}
96+
return m_queue_back->element;
97+
}
98+
99+
//函数功能: 删除队列首元素
100+
template <typename anytype>
101+
void LinkQueue<anytype>::pop()
102+
{
103+
if (m_queue_front == nullptr)
104+
{
105+
std::ostringstream os;
106+
os << "The queue is empty .";
107+
throw os.str();
108+
}
109+
MLQ::ChainNode<anytype> *temp = m_queue_front->next;
110+
delete m_queue_front;
111+
m_queue_front = temp;
112+
--m_queue_size;
113+
}
114+
115+
//函数功能: 队尾插入队列
116+
template <typename anytype>
117+
void LinkQueue<anytype>::push(const anytype &element)
118+
{
119+
//申请新元素内存
120+
MLQ::ChainNode<anytype> *next_node = new ChainNode<anytype>(element, nullptr);
121+
if (m_queue_front == nullptr)
122+
{
123+
m_queue_front = next_node;
124+
}
125+
else
126+
{
127+
m_queue_back->next = next_node;
128+
}
129+
m_queue_back = next_node;
130+
++m_queue_size;
131+
}
132+
}

0 commit comments

Comments
 (0)