严蔚敏关于栈的代码

  1 * 栈基本操作 
  2 * 08/25/2010 
  3 * 参考自严蔚敏等《数据结构(C语言版)》清华大学出版社 
  4 */ 
  5 #include <iostream> 
  6 #include <stdlib.h> 
  7 #include <assert.h> 
  8 using namespace std; 
  9 
 10 // constant definition 
 11 static const int STACK_INIT_SIZE = 10; // the size of initial 
 12 static const int STACK_INCREMENT = 10; // the size of each increase 
 13 
 14 // describe the stack 
 15 typedef struct _STACK{ 
 16 int *bottom; 
 17 int *top; 
 18 int size; 
 19 }STACK, *PSTACK; 
 20 
 21 // construct an empty stack 
 22 void stack_init(STACK &stack) 
 23 { 
 24 stack.bottom = (int *) malloc(STACK_INIT_SIZE * sizeof(int)); 
 25 assert(stack.bottom != NULL); 
 26 stack.top = stack.bottom; 
 27 stack.size = STACK_INIT_SIZE; 
 28 } 
 29 
 30 // push an element in the stack as the new top 
 31 void stack_push(STACK &stack, int element) 
 32 { 
 33 if((stack.top - stack.bottom) >= stack.size) 
 34 { 
 35 // stack is full, allocate more memory 
 36 stack.bottom = (int *) realloc(stack.bottom, (STACK_INIT_SIZE + 
 37 STACK_INCREMENT) * sizeof(int)); 
 38 assert(stack.bottom != NULL); 
 39 stack.top = stack.bottom + stack.size; 
 40 stack.size += STACK_INCREMENT; 
 41 } 
 42 
 43 *stack.top++ = element; 
 44 cout << "push " << element << endl; 
 45 } 
 46 
 47 // pop the top element in stack if the stack is not empty 
 48 void stack_pop(STACK &stack, int &element) 
 49 { 
 50 if(stack.top == stack.bottom) 
 51 { 
 52 // stack is empty, can not pop stack 
 53 cout << "ERROR - pop: stack is empty" << endl; 
 54 return ; 
 55 } 
 56 
 57 element = *(--stack.top); 
 58 cout << "pop " << element << endl; 
 59 } 
 60 // get the top element if stack is not empty 
 61 void stack_top(const STACK stack, int &element) 
 62 { 
 63 if(stack.top == stack.bottom) 
 64 { 
 65 cout << "ERROR - top: stack is empty" << endl; 
 66 element = -1; 
 67 return; 
 68 } 
 69 
 70 element = *(stack.top - 1); 
 71 cout << "top " << element << endl; 
 72 } 
 73 
 74 // retrieve the number of elements in stack 
 75 int stack_length(const STACK stack) 
 76 { 
 77 return (int)(stack.top - stack.bottom); 
 78 } 
 79 
 80 // determine whether the stack is empty 
 81 bool stack_is_empty(const STACK stack) 
 82 { 
 83 return (stack.top - stack.bottom) ? false : true; 
 84 } 
 85 // destroy the stack and the stack is not exist in memory any more 
 86 void stack_destroy(STACK &stack) 
 87 { 
 88 if(stack.bottom) free(stack.bottom); 
 89 stack.bottom = stack.top = NULL; 
 90 cout << "destroy ok" << endl; 
 91 } 
 92 
 93 // clear all elements in stack 
 94 void stack_clear(STACK &stack) 
 95 { 
 96 stack.top = stack.bottom; 
 97 } 
 98 
 99 // traverse the stack and print all elements from top to bottom 
100 void stack_print(const STACK stack) 
101 { if(stack_is_empty(stack)) 
102 { 
103 cout << "stack is empty" << endl; 
104 return ; 
105 } 
106 cout << "(top) "; 
107 int *p = stack.top; 
108 while(p != stack.bottom) 
109 { 
110 cout << *(--p) << " "; 
111 } 
112 cout << *p << " (bottom)" << endl; 
113 } 
114 // start from here 
115 int main() 
116 { 
117 STACK stack; 
118 stack_init(stack); 
119 
120 int i, j; 
121 for(i=0; i<15; i++) 
122 stack_push(stack, i); 
123 stack_print(stack); 
124 cout << "length " << stack_length(stack) << endl; 
125 for(j=0; j<16; j++) 
126 stack_pop(stack, i); 
127 stack_print(stack); 
128 
129 if(stack_is_empty(stack)) cout << "stack is empty" << endl; 
130 else cout << "stack is not empty" << endl; 
131 
132 stack_clear(stack); 
133 stack_destroy(stack); 
134 
135 system("PAUSE"); 
136 return 0; 
137 }

 

posted @ 2013-05-16 11:19  herizai  阅读(212)  评论(0编辑  收藏  举报