剑指offer面试题7

来源:互联网 发布:java对接微信公众平台 编辑:程序博客网 时间:2024/04/30 09:12

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

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数appendTail和deleteHead,分别完成在队列尾部插入结点和队列头部删除结点的功能。

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    stack<T> stack2;};

预备知识

:是一种常见的数据结构,如操作系统会给每个线程创建一个栈来存储函数调用时各个函数的参数、返回地址及临时变量;特点是后进先出(LIFO)

队列:队列也是一种常见的数据结构;特点是先进先出(FIFO)

在STL中有stack和queue两个容器

template <class T, class Container = deque<T> > class stack;
成员函数

empty; 

size;  //大小

top;    //访问下一个元素

push;  //插入元素

pop;   //移除顶部元素

template <class T, class Container = deque<T> > class queue;
成员函数

empty  判断容器是否为空

size   队列大小

front  访问下一个元素

back 访问最后一个元素

push 插入元素

pop 移除元素


思路:定义两个栈stack1和stack2,先把数据压入stack1中,然后将stack1的数据弹出,压入stack2中,之后逐个弹出stack2中的元素,这样就可以实现利用两个栈实现队列的功能。

代码实现

Queue.h

#pragma once         //在头文件的最开始加入这条指令就能够保证头文件被编译一次#include <stack>     //stack容器,stack#include <exception>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    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)    {        while(stack1.size()>0)        {            T& data = stack1.top();  //Access next element            stack1.pop();            //Remove top element            stack2.push(data);       //Insert element         }    }    if(stack2.size() == 0)        throw new exception("queue is empty");    T head = stack2.top();  //Access next element    stack2.pop();           //Remove top element    return head;}

Queue.cpp

#include "StdAfx.h"#include "Queue.h"#include <queue>  //queue容器

Main.cpp

#include "stdafx.h"#include "Queue.h"void Test(char actual, char expected){    if(actual == expected)        printf("Test passed.\n");    else        printf("Test failed.\n");}int _tmain(int argc, _TCHAR* argv[]){    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');    return 0;}


另附代码:

// 面试题7.cpp : 定义控制台应用程序的入口点。//// 用两个栈实现队列#include "stdafx.h"#include <stack>#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){while(stack1.size() > 0){T& data = stack1.top(); //栈顶元素stack1.pop();//出栈stack2.push(data);    //入栈}}if(stack2.size() == 0)throw new exception("queue is empty");T head = stack2.top();  //栈顶元素stack2.pop();//出栈return head;}/******代码测试*******/void Test1(){CQueue<int> queue;queue.appendTail(1);queue.appendTail(2);queue.appendTail(3);int val = queue.deleteHead();cout << "val = " << val << endl;}void Test2(){CQueue<int> queue;queue.appendTail(1);queue.appendTail(2);queue.appendTail(3);int val = queue.deleteHead();cout << "val = " << val << endl;queue.appendTail(5);cout << "val1= "<<queue.deleteHead();}void Test3(){CQueue<int> queue;queue.appendTail(1);queue.appendTail(2);queue.appendTail(3);queue.deleteHead();queue.deleteHead();queue.deleteHead();}int _tmain(int argc, _TCHAR* argv[]){Test1();Test2();Test3();return 0;}



0 0
原创粉丝点击