#include < iostream >
using namespace std;
using namespace std;
template < class T >
class node
{
public:
T info;
node < T > * link;
public:
node(const T& t = 0) :info(t), link(NULL)
{
class node
{
public:
T info;
node < T > * link;
public:
node(const T& t = 0) :info(t), link(NULL)
{
}
};
};
template < typename T >
class myqueue
{
int n_size;
public:
myqueue() :head(NULL), tail(NULL), n_size(0) {}
~myqueue()
{
clear();
}
void push(const T& t) //向队伍增添成员,和链表一样
{
node < T > * temp = new node; //新
if (!head)
{
head = temp;
tail = head;
}
else
{
temp->info = t; //装
tail->link = temp; //连
tail = temp;
}
n_size++;
}
class myqueue
{
int n_size;
public:
myqueue() :head(NULL), tail(NULL), n_size(0) {}
~myqueue()
{
clear();
}
void push(const T& t) //向队伍增添成员,和链表一样
{
node < T > * temp = new node; //新
if (!head)
{
head = temp;
tail = head;
}
else
{
temp->info = t; //装
tail->link = temp; //连
tail = temp;
}
n_size++;
}
void pop() //弹出队伍
{
if (empty())
{
return;
}
node < T > * temp = head;
head = head->link;
delete temp;
{
if (empty())
{
return;
}
node < T > * temp = head;
head = head->link;
delete temp;
if (head == NULL)
tail = NULL;
tail = NULL;
n_size = 0;
}
}
int size()
{
return n_size;
}
{
return n_size;
}
void clear()
{
node < T > * temp;
while (head)
{
temp = head;
head = head->link;
delete temp;
}
n_size = 0;
{
node < T > * temp;
while (head)
{
temp = head;
head = head->link;
delete temp;
}
n_size = 0;
}
bool empty() //判断队列是否是空队
{
return n_size == 0;
}
{
return n_size == 0;
}
T& front() //查看队头,返回头部数据
{
return head->info;
}
{
return head->info;
}
T& back() //查看队尾,返回尾部数据
{
return tail->info;
}
protected:
node < T > * head;
node < T > * tail;
};
{
return tail->info;
}
protected:
node < T > * head;
node < T > * tail;
};
int main()
{
myqueue < int > q;
int i = 0;
int j = 0;
int k = 0;
for (i = 0; i < 10; i++)
q.push(i);
q.push(i);
for (k = 0; !q.empty(); k++)
{
if (k != q.front())
{
cout << "Test case 1: Failed ..." << endl;
return 1;
}
cout << q.front();
q.pop();
}
cout << endl;
cout << "Test case 1: passed" << endl;
{
if (k != q.front())
{
cout << "Test case 1: Failed ..." << endl;
return 1;
}
cout << q.front();
q.pop();
}
cout << endl;
cout << "Test case 1: passed" << endl;
// ---- 不太华丽的分割线-----------
for (j = 0; j < 999; j++)
{
q.push(j);
}
q.clear();
if (q.size() != 0)
{
cout << "Test case 2: failed ..." << endl;
return 1;
}
cout << "Test case 2: passed..." << endl;
for (j = 0; j < 999; j++)
{
q.push(j);
}
q.clear();
if (q.size() != 0)
{
cout << "Test case 2: failed ..." << endl;
return 1;
}
cout << "Test case 2: passed..." << endl;
// ---- 不太华丽的分割线-----------
myqueue < string > q_s;
int loop_time = 9999;
for (i = 1; i < loop_time; i++)
{
q_s.push(string("string:") += i);
}
myqueue < string > q_s;
int loop_time = 9999;
for (i = 1; i < loop_time; i++)
{
q_s.push(string("string:") += i);
}
for (i = 0; i < loop_time + 100; i++)
{
q_s.pop();
}
if (q_s.size() != 0)
{
cout << "Test case 3: failed ..." << endl;
return 1;
}
cout << "Test case 3: passed..." << endl;
{
q_s.pop();
}
if (q_s.size() != 0)
{
cout << "Test case 3: failed ..." << endl;
return 1;
}
cout << "Test case 3: passed..." << endl;
// ---- 不太华丽的分割线-----------
myqueue < int > q_i;
q_i.clear();
for (i = 0; i < loop_time; i++)
{
q_i.push(i);
}
q_i.clear();
if (q_i.size() != 0)
{
cout << "Test case 4: failed ..." << endl;
return 1;
}
cout << "Test case 4: passed..." << endl;
}
myqueue < int > q_i;
q_i.clear();
for (i = 0; i < loop_time; i++)
{
q_i.push(i);
}
q_i.clear();
if (q_i.size() != 0)
{
cout << "Test case 4: failed ..." << endl;
return 1;
}
cout << "Test case 4: passed..." << endl;
}
================================================================
这个代码会出错!错在 mylist < T > :: push_back()函数
继续查,错在node的构造
继续查,错在string构造
继续查,string用0构造
继续查,原因在这个构造函数
template < class T >
class node
{
public:
T info;
node* link;
public:
node(const T& t = 0) :info(t), link(NULL)
{
class node
{
public:
T info;
node* link;
public:
node(const T& t = 0) :info(t), link(NULL)
{
}
};
};
string用0构造,相当于传入const char* s=NULL, 完蛋!
怎么办,有个偷懒方法,修改构造函数为
node(const T& t = T()) :info(t), link(NULL)
{
{
}
这样,当无参数传入构造node, 相当于构造一个临时无名变量string(), 这样就不出错啦!!!