标签:
题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和在队列头部删除结点的功能。
template <typename T>class CQueue { public: CQueue(void); ~CQueue(void); void appendtail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; };
解题思路:
插入操作在stack1中进行,删除操作在stack2中进行,如果stack2为空,则将stack1中的所有元素转移到stack2中。
#include<stack> #include<stdio.h> #include<iostream> using namespace std; template <typename T> class CQueue { public: CQueue(void); ~CQueue(void); void appendTail(const T& node); T deleteHead(); private: stack<T> stack1; stack<T> stack2; }; //构造函数 template <typename T> CQueue<T>::CQueue(void) { } //析构函数 template <typename T> CQueue<T>::~CQueue(void) { } //插入元素 template <typename T>void CQueue<T>::appendTail(const T& element) { stack1.push(element); } //删除元素并返回 template <typename T> T CQueue<T>::deleteHead() { if(stack2.size() <= 0) //当stack2为空时才可以将stack1中的数移过来 { while(stack1.size()>0) { T& data = stack1.top(); stack1.pop(); stack2.push(data); } } if(stack2.size() == 0) //throw new exception("queue is empty"); exit(1); T head = stack2.top(); stack2.pop(); return head; } void Test(char actual, char expected) { if(actual == expected) printf("Test passed\n"); else printf("Test failed.\n"); } int main() { CQueue<char> queue; queue.appendTail(‘a‘); queue.appendTail(‘b‘); queue.appendTail(‘c‘); char head = queue.deleteHead(); Test(head, ‘a‘); head = queue.deleteHead(); Test(head, ‘b‘); queue.appendTail(‘d‘); head = queue.deleteHead(); Test(head, ‘c‘); queue.appendTail(‘e‘); head = queue.deleteHead(); Test(head, ‘d‘); head = queue.deleteHead(); Test(head, ‘e‘); queue.appendTail(‘a‘); queue.appendTail(‘b‘); queue.appendTail(‘c‘); queue.appendTail(‘d‘); int length = 4; while(length > 0) { printf("%c ", queue.deleteHead()); --length ; } return 0; }
标签:
原文地址:http://www.cnblogs.com/sankexin/p/5612446.html