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

题目链接:http://ac.jobdu.com/problem.php?pid=1512

思路:题目要求我们利用两个“先进后出”的栈实现一个“先进先出”的队列。

插入时,将插入的元素放入stack1中。假设现在stack1中已经插入了若干元素,

要进行删除操作。显然现在栈顶的元素是后插入的应该后出,栈底的元素才应该

被删除,而在stack1中无法直接删除栈底元素。此时就应该借助stack2,之前

未对stack2进行操作,stack2为空。将stack1中的元素逐个出栈压入stack2中,

那么stack2中的栈顶元素就是要删除的元素。之后要插入元素就压入stack1中,

要删除元素就将stack2栈顶元素删除,若stack2为空,则将stack1的全部元素

逐个出栈压入stack2中,再完成删除,若stack1和stack2都为空,无法完成删除操作。

注意:

1、本题最好写成模板,更为通用。

2、可以写个判断队列是否非空的函数。

code:

 1 #include <iostream>

 2 #include <stack>

 3 #include <string>

 4 using namespace std;

 5 

 6 template<typename T> class CQueue

 7 {

 8 public:

 9     CQueue(void);

10     ~CQueue(void);

11 

12     void appendTail(const T& node);

13     T deleteHead();

14     bool empty();

15 private:

16     stack<T> stack1;

17     stack<T> stack2;

18 };

19 

20 //构造函数

21 template<typename T> CQueue<T>::CQueue(void)

22 {

23     ;

24 }

25 

26 //析构函数

27 template<typename T> CQueue<T>::~CQueue(void)

28 {

29     ;

30 }

31 

32 template<typename T> void CQueue<T>::appendTail(const T& element)

33 {

34     stack1.push(element);

35 }

36 

37 template<typename T> T CQueue<T>::deleteHead()

38 {

39     if (stack2.size() <= 0)

40     {

41         while (stack1.size() > 0)

42         {

43             T& data = stack1.top();

44             stack1.pop();

45             stack2.push(data);

46         }

47     }

48 

49     T head = stack2.top();

50     stack2.pop();

51     return head;

52 }

53 

54 template<typename T> bool CQueue<T>::empty()

55 {

56     if (stack1.size() + stack2.size() <= 0) return true;

57     return false;

58 }

59 

60 

61 int main()

62 {

63     int n;

64     while (cin >> n)

65     {

66         CQueue<int> myQuence;

67         for (int i = 0; i < n; ++i)

68         {

69             string myStr;

70             cin >> myStr;

71             if (myStr == "PUSH")

72             {

73                 int k;

74                 cin >> k;

75                 myQuence.appendTail(k);

76             }

77             else

78             {

79                 if (myQuence.empty()) cout << -1 << endl;

80                 else cout << myQuence.deleteHead() << endl;

81             }

82         }

83     }

84     return 0;

85 }

 

你可能感兴趣的:(面试题)