本章讲述的是基本的数据结构,如栈、队列和链表。这些都是最最基本的数据结构,具体的就不再啰嗦。然后本章也没有什么需要特别注意的点,哦,有一个小节:指针和对象的实现,可以认真看一下,大概就是用其他的实现方式来代替指针和对象的实现,因为有些语言不支持指针和对象数据类型,那在实现这种链式的数据结构就无法表示,本节介绍的方法就是利用数组和数组下标来构造对象和指针,说白了,就是利用数组来表示链式对象。个人感觉意义不大,权当了解得了。
结合一些常见的笔试面试题,我就用3个习题来总结这一章吧。
1、习题10.1-6:说明如何用两个栈实现一个队列,并分析相关队列操作的运行时间。
两个栈实现一个队列和两个队列实现一个栈的思路都是一样的。
算法思路:
1)StackA和StackB,StackA作为存储栈,StackB作为辅助栈;
2)入队列操作:假如StackA中有元素,则首先将StackA中元素出栈放入StackB中,再把入队列元素放入StackA,然后再把StackB中的元素出栈放入StackA中
3)出队列操作:以上操作保证先入队列的元素先出,所以,直接从StackA中出栈即可。
如下直观的图示:
代码如下:
1 #include <iostream> 2 #include <stack> 3 #include <cstdlib> 4 5 using namespace std; 6 7 /************************************************************************/ 8 /* 两个栈实现队列 9 /* 采用C++模板是实现 10 /************************************************************************/ 11 template<class T> 12 class StackQueue 13 { 14 public: 15 StackQueue(){} 16 ~StackQueue(){} 17 18 void Enqueue(const T& elem); 19 T Dequeue(); 20 bool Empty() const; 21 22 private: 23 stack<T> m_stackA; 24 stack<T> m_stackB; 25 }; 26 27 template<class T> 28 void StackQueue<T>::Enqueue(const T& elem) 29 { 30 if (m_stackA.empty()) 31 m_stackA.push(elem); 32 else { 33 while (!m_stackA.empty()) { 34 m_stackB.push(m_stackA.top()); 35 m_stackA.pop(); 36 } 37 m_stackA.push(elem); 38 } 39 40 while(!m_stackB.empty()) { 41 m_stackA.push(m_stackB.top()); 42 m_stackB.pop(); 43 } 44 } 45 46 template<class T> 47 T StackQueue<T>::Dequeue() 48 { 49 T retElem; 50 if (!m_stackA.empty()) { 51 retElem = m_stackA.top(); 52 m_stackA.pop(); 53 } 54 return retElem; 55 } 56 57 template<class T> 58 bool StackQueue<T>::Empty() const 59 { 60 if (m_stackA.empty()) 61 return true; 62 else 63 return false; 64 } 65 66 // int main() 67 // { 68 // StackQueue<int> SQ; 69 // for (int i = 1; i <= 5; i ++) { 70 // SQ.Enqueue(i); 71 // } 72 // 73 // for (int i = 1; i <= 5; i ++) { 74 // cout << SQ.Dequeue(); 75 // } 76 // return 0; 77 // }