数据结构之栈
1 //链栈C++描述 2 #include <iostream> 3 using namespace std; 4 5 struct Node 6 { 7 int data; //数据域 8 Node *next; //指针域 9 }; 10 11 12 class LinkStack 13 { 14 public: 15 LinkStack(); //构造函数,初始化一个空链栈 16 ~LinkStack(); //析构函数,释放链栈各结点的存储空间 17 void Push(int x); //入栈操作,将元素x入栈 18 int Pop(); //出栈操作,将栈顶元素出栈 19 int GetTop(); //取栈顶元素(并不删除) 20 int Empty(); //判空操作,判断链栈是否为空栈 21 private: 22 Node *top; //栈顶指针即链栈的头指针 23 }; 24 25 26 LinkStack::LinkStack() 27 { 28 top = new Node; //生成头结点 29 top->data = 0; 30 top->next = NULL; //头结点的指针域置空 31 } 32 33 34 LinkStack :: ~LinkStack() 35 { 36 Node *q = NULL; 37 while (top != NULL) //释放链栈的每一个结点的存储空间 38 { 39 q = top; //暂存被释放结点 40 top = top->next; // top指向被释放结点的下一个结点 41 delete q; 42 } 43 q = NULL; 44 } 45 46 47 int LinkStack::GetTop() 48 { 49 if (top == NULL) 50 throw "下溢异常"; 51 else 52 return top->data; 53 } 54 55 56 57 void LinkStack::Push(int x) 58 { 59 Node *s = NULL; 60 s = new Node; s->data = x; //申请结点s数据域为x 61 s->next = top; top = s; //将结点s插在栈顶 62 } 63 64 65 int LinkStack::Pop() 66 { 67 Node *p = NULL; 68 int x; 69 if (top == NULL) throw "下溢"; 70 x = top->data; p = top; //暂存栈顶元素 71 top = top->next; //将栈顶结点摘链 72 delete p; 73 return x; 74 } 75 76 77 int LinkStack::Empty() 78 { 79 if (top->next == NULL) 80 return 1; 81 else 82 return 0; 83 } 84 85 int main() 86 { 87 int x, y, z; 88 LinkStack S; //定义链栈变量S 89 S.Push(1); 90 S.Push(2); 91 cout << "取栈顶元素" << S.GetTop()<<endl; 92 cout << "栈顶元素出栈" << S.Pop()<<endl; 93 if (S.Empty() == 1) cout << "栈为空" << endl; 94 else cout << "栈非空" << endl; //栈有2个元素,输出栈非空 95 return 0; 96 } 97 98 99 100 //C语言描述 101 # include <stdio.h> 102 # include <malloc.h> 103 # include <stdlib.h> 104 105 typedef struct Node 106 { 107 int data; 108 struct Node * pNext; 109 }NODE, * PNODE; 110 111 typedef struct Stack 112 { 113 PNODE pTop; 114 PNODE pBottom; 115 }STACK, * PSTACK; //PSTACK 等价于 struct STACK * 116 117 void init(PSTACK); 118 void push(PSTACK, int ); 119 void traverse(PSTACK); 120 bool pop(PSTACK, int *); 121 void clear(PSTACK pS); 122 123 int main(void) 124 { 125 STACK S; //STACK 等价于 struct Stack 126 int val; 127 128 init(&S); //目的是造出一个空栈 129 push(&S, 1); //压栈 130 push(&S, 2); 131 push(&S, 3); 132 push(&S, 4); 133 push(&S, 5); 134 push(&S, 6); 135 traverse(&S); //遍历输出 136 137 clear(&S); 138 //traverse(&S); //遍历输出 139 140 if ( pop(&S, &val) ) 141 { 142 printf("出栈成功,出栈的元素是%d\n", val); 143 } 144 else 145 { 146 printf("出栈失败!\n"); 147 } 148 149 traverse(&S); //遍历输出 150 151 return 0; 152 } 153 154 void init(PSTACK pS) 155 { 156 pS->pTop = (PNODE)malloc(sizeof(NODE)); 157 if (NULL == pS->pTop) 158 { 159 printf("动态内存分配失败!\n"); 160 exit(-1); 161 } 162 else 163 { 164 pS->pBottom = pS->pTop; 165 pS->pTop->pNext = NULL; //pS->Bottom->pNext = NULL; 166 } 167 } 168 169 void push(PSTACK pS, int val) 170 { 171 PNODE pNew = (PNODE)malloc(sizeof(NODE)); 172 173 pNew->data = val; 174 pNew->pNext = pS->pTop; //pS->Top不能改成pS->Bottom 175 pS->pTop = pNew; 176 177 return; 178 } 179 180 void traverse(PSTACK pS) 181 { 182 PNODE p = pS->pTop; 183 184 while (p != pS->pBottom) 185 { 186 printf("%d ", p->data); 187 p = p->pNext; 188 } 189 printf("\n"); 190 191 return; 192 } 193 194 bool empty(PSTACK pS) 195 { 196 if (pS->pTop == pS->pBottom) 197 return true; 198 else 199 return false; 200 } 201 202 //把pS所指向的栈出栈一次,并把出栈的元素存入pVal形参所指向的变量中,如果出栈失败,返回false,否则返回true 203 bool pop(PSTACK pS, int * pVal) 204 { 205 if ( empty(pS) ) //pS本身存放的就是S的地址 206 { 207 return false; 208 } 209 else 210 { 211 PNODE r = pS->pTop; 212 *pVal = r->data; 213 pS->pTop = r->pNext; 214 free(r); 215 r = NULL; 216 217 return true; 218 } 219 } 220 221 //clear清空 222 void clear(PSTACK pS) 223 { 224 if (empty(pS)) 225 { 226 return; 227 } 228 else 229 { 230 PNODE p = pS->pTop; 231 PNODE q = NULL; 232 233 while (p != pS->pBottom) 234 { 235 q = p->pNext; 236 free(p); 237 p = q; 238 } 239 pS->pTop = pS->pBottom; 240 } 241 }
道阻且长,行则将至

浙公网安备 33010602011771号