queue.h#ifndef QUEUE_H_INCLUDED
#define QUEUE_H_INCLUDED
#include <iostream>
#include <new>
template <class T>
class Queue
{
private:
class Node
{
public:
T data;
Node * next;
Node(const T & d) : data(d), next(nullptr) {}
Node() : next(nullptr) {}
};
typedef Node * LinkList;
LinkList front;
LinkList rear;
unsigned int length;
public:
Queue();
~Queue();
bool enqueue(const T & item);
bool dequeue(T & item);
void show()const;
bool is_empty()const { return length == 0;}
unsigned int size()const { return length; }
};
template <class T>
Queue<T>::Queue()
{
front = rear = nullptr;
length = 0;
}
template <class T>
Queue<T>::~Queue()
{
if (front != nullptr)
{
LinkList temp = front;
while (front)
{
front = front -> next;
delete temp;
temp = front;
}
}
}
template <class T>
bool Queue<T>::enqueue(const T & item)
{
if (is_empty())
{
try{
front = rear = new Node(item);
}
catch(std::bad_alloc & ba) {
std::cout << ba.what() << std::endl;
return false;
}
length++;
return true;
}
LinkList add;
try {
add = new Node(item);
}
catch(std::bad_alloc & ba) {
std::cout << ba.what() << std::endl;
return false;
}
rear -> next = add;
rear = add;
length++;
return true;
}
template <class T>
bool Queue<T>::dequeue(T & item)
{
if (is_empty())
return false;
item = front -> data;
LinkList temp = front;
front = front -> next;
delete temp;
if (front == nullptr)
rear = front;
length--;
return true;
}
template <class T>
void Queue<T>::show()const
{
LinkList p = front;
while (p)
{
std::cout << p -> data << " ";
p = p -> next;
}
std::cout << std::endl;
}
#endif // QUEUE_H_INCLUDED
main.cpp#include <iostream>
#include "queue.h"
int main()
{
Queue<char> triangle;
using std::cout;
using std::endl;
using std::cin;
cout << "请输入一串符号: ";
char ch;
do
{
cin.get(ch);
if (ch != '\n')
triangle.enqueue(ch);
}while(cin && ch != '\n');
char once = '\0'; // 存储前一个字符
cout << "下面按要求打印符号三角形:\n";
if (triangle.is_empty())
return 0;
triangle.show(); // 打印第一行
unsigned int size = triangle.size();
for (unsigned int i = 2; i <= size; i++) // 从第二行开始打印
{
for (unsigned int j = 0; j < i - 1; j++)
cout << " ";
for (unsigned int k = 0; k <= size - i; k++) // 第i行输出size - i + 1个符号
{
char c;
if (once == '\0')
{
triangle.dequeue(c);
triangle.dequeue(ch);
}
else
{
c = once;
triangle.dequeue(ch);
}
if (c == ch)
triangle.enqueue('+');
else
triangle.enqueue('-');
once = ch;
}
triangle.show();
once = '\0';
}
return 0;
}
|