面试题7:用两个栈实现队列和用两个队列实现栈

题目:

1.0 用两个栈实现一个队列。

队列声明如下,请实现它的两个函数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中,这样就保证了最后最早输入的元素都在stack2的栈顶,直接弹出即可,实现先进先出。

若stack2不为空,则直接弹出其顶端元素。代码实现:::stack;/*********************** 面试题7:用两个栈实现队列* 队列的声明如下,请实现它的两个函数appendTrail 和 deleteHead,分别完成在队尾部插入节点和在队头部删除节点的功能***************************/template <typename T>class CQueue{public:CQueue(void) = default;~CQueue(void) = default;void appendTail(const T& node);T deleteHead();private:stack<T> stack1;stack<T> stack2;};<typename T>void CQueue<T>::appendTail(const T& node){stack1.push(node);}template<typename T>T CQueue<T>::deleteHead(){if(stack2.size()<=0){while(stack1.size()>0){stack2.push(stack1.top());stack1.pop();}}if(stack2.size()==0)::exception(“queue id empty”);T head=stack2.top();stack2.pop();return head;}2.0 用两个队列实现栈

栈声明如下:

template<typename T>class CStack{public:CStack() = default;~CStack() = default;private:queue<T> q1;queue<T> q2;};解题思路: 入栈操作:在队列q1中进行,出队操作:当q1为空时,将q2中n-1个元素都转移至q1,弹出q2中最后的元素,当q1不为空时,将q1的n-1元素转移至q2,弹出最后一个元素。代码实现::queue;template<typename T>class CStack{public:CStack() = default;~CStack() = default;void appendTail(const T& node){q1.push(node);}T deleteHead(){if (q1.size() <= 0 && q2.size() <= 0)throw new exception(“stack is empty”);if (q1.size() == 0){while (q2.size() > 1){q1.push(q2.front());q2.pop();}T head = q2.front();q2.pop();return head;}else{while (q1.size() > 1){q2.push(q1.front());q1.pop();}T head = q1.front();q1.pop();return head;}}private:queue<T> q1;queue<T> q2;};#endif

测试:

;int _tmain(int argc, _TCHAR* argv[]){/*CQueue<int> a;a.appendTail(1);a.appendTail(2);a.appendTail(3);*/CStack<int> s;s.appendTail(1);s.appendTail(2);s.appendTail(3);s.appendTail(4);s.appendTail(5);try{std::cout << s.deleteHead();s.appendTail(6);s.appendTail(7);std::cout << s.deleteHead();std::cout << s.deleteHead();}catch (exception* e)//捕捉异常{cout << e->what() << endl;}system(“pause”);return 0;}

,以后我会去到很多很繁华或苍凉,

面试题7:用两个栈实现队列和用两个队列实现栈

相关文章:

你感兴趣的文章:

标签云: