算法导论上,第10章的一个练习,用一个数组实现存储两个栈,使的每个栈的push和pop的时间都是O(1)
1 #ifndef DOUBLESTACK_H 2 #define DOUBLESTACK_H 3 4 #define TOTAL 10 5 6 template<class T> 7 class double_stack 8 { 9 T m_array[20]; 10 int m_top1, m_end1; 11 int m_top2, m_end2; 12 public: 13 double_stack(); 14 void push(int stack_num, T &data); 15 void pop(int stack_num); 16 void print(); 17 }; 18 19 /************************************************* 20 Function: // double_stack 21 Description: // 构造函数 22 Input: // 无 23 Return: // 无 24 *************************************************/ 25 template<class T> 26 double_stack<T>::double_stack() 27 { 28 m_top1 = 0; 29 m_top2 = TOTAL - 1; 30 m_end1 = 0; 31 m_end2 = TOTAL - 1; 32 } 33 34 /************************************************* 35 Function: // push 36 Description: // 压栈函数 37 Input: // stack_num: 被压入堆栈编号 38 // T : 带压栈数据 39 Return: // 无 40 *************************************************/ 41 template<class T> 42 void double_stack<T>::push(int stack_num, T &data) 43 { 44 if(m_end2 >= m_end1) 45 { 46 switch (stack_num) 47 { 48 case 1: 49 m_array[m_end1++] = data; 50 break; 51 case 2: 52 m_array[m_end2--] = data; 53 default: 54 break; 55 } 56 } 57 else 58 { 59 cout << "overflow" << endl; 60 } 61 } 62 63 /************************************************* 64 Function: // push 65 Description: // 出栈函数 66 Input: // stack_num: 被压入堆栈编号 67 Return: // 无 68 *************************************************/ 69 template<class T> 70 void double_stack<T>::pop(int stack_num) 71 { 72 switch(stack_num) 73 { 74 case 1: 75 if (m_end1 > m_top1) 76 { 77 cout << m_array[--m_end1] << endl; 78 } 79 else 80 { 81 cout << "downflow" << endl; 82 } 83 break; 84 case 2: 85 if (m_end2 < m_top2) 86 { 87 cout << m_array[++m_end2] << endl; 88 } 89 else 90 { 91 cout << "downflow" << endl; 92 } 93 break; 94 default: 95 break; 96 } 97 } 98 99 /************************************************* 100 Function: // push 101 Description: // 出栈函数 102 Input: // stack_num: 被压入堆栈编号 103 Return: // 无 104 *************************************************/ 105 template<class T> 106 void double_stack<T>::print() 107 { 108 for(int i = 0; i < TOTAL; i++) 109 { 110 cout << m_array[i] << " "; 111 } 112 cout << endl; 113 } 114 #endif