[D-OJ练习] 队列的链式存储结构与操作

请定义一个链式队列,可以对队列进行“入队”、“出队”、“清空队列”、“获取队首元素”等操作。键盘输入一些命令,可以执行上述操作。本题中,队列的元素为字符。

输入描述

输入各个命令,它们对应的格式如下: 
入队:E a,a代表入队的元素,这里E和元素之间用空格分隔。 
清空队列:C 
获取队头元素:G 
队头元素出队列:D 
当输入的命令为Q时,程序结束。

输出描述

当输入的命令为D时,输出出队的元素值; 
当输入的命令是G时,输出当前队首元素值; 
如果没有元素可出队或可取,请输出None; 
输出的元素各占一行。

输入样例

E a
G
C
E b
E c
D
D
D
Q

输出样例

a
b
c
None

#include <iostream>
using namespace std;

struct Node {
	char ch;
	Node* next;
	Node(char c):ch(c), next(NULL){}
};
class Queue {
private:
	int length;
	Node* phead;
	Node* ptail;
public:
	Queue();
	void Push(char newCh);
	void GetFirst();
	char Pop();
	void Clear();
};

Queue::Queue() {
	length = 0;
	phead = new Node(' ');
	ptail = phead;
}

void Queue::Push(char newCh) {
	Node* p = new Node(newCh);
	ptail->next = p;
	ptail = p;
	length++;
}
void Queue::GetFirst(){
	if(length==0){
		cout << "None" << endl;
		return ;
	}
	cout << phead->next->ch << endl;
}

char Queue::Pop(){
	if(length==0){
		return ' ';
	}
	Node* p = phead->next;
	char c = p->ch;
	phead->next = p->next;
	
	delete p;
	length--;
	return c;
}

void Queue::Clear(){
	Node* headNext = NULL;
	Node* p = phead->next;
	while(p){
		headNext = p->next;
		delete p;
		p = headNext;
	}
	phead->next = NULL;
	ptail = phead;
	length = 0;
}
int main()
{
	Queue q;
	char choice;
	char addCh,ch;
	int isContinue = 1;
	while (isContinue) 
	{
		cin >> choice;
		switch (choice)
		{
		case 'E':
			cin >> addCh;
			q.Push(addCh);
			break;
		case 'G':
			q.GetFirst();
			break;
		case 'D':
			ch = q.Pop();
			if(ch == ' '){
				cout << "None" << endl;
			}else{
				cout << ch << endl;
			}
			break;
		case 'C':
			q.Clear();
			break;
		case 'Q':
			isContinue = 0;
			break;
		}
	}
	return 0;
}

posted @ 2021-09-24 12:40  泥烟  阅读(70)  评论(0编辑  收藏  举报