栈与队列:栈的链式储存结构
Posted zhenglijie
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了栈与队列:栈的链式储存结构相关的知识,希望对你有一定的参考价值。
1 链栈通常用单链表表示,由于栈的主要操作是栈顶插入与删除,显然以链表的头部作为栈顶最方便,而且没必要为了操作方便附加一个头结点 2 //链式存储结构(将单链表头指针与栈顶合二为一) 3 typedef struct StackNode 4 { 5 ElemType data; 6 struct StackNode *next; 7 }StackNode,*LinkStackPtr; 8 typedef struct LinkStack 9 { 10 LinkStackPtr top; 11 int count; 12 } 13 Status Push(LinkStack *s,ElemType e) 14 { 15 LinkStackPtr p = (LinkStackPtr)malloc(sizeof(StackNode)); 16 p->data = e; 17 p->next = s->top; //新插入结点的指针域指向栈顶 18 s->top = p; //栈顶换成p 19 s->count++; 20 return OK; 21 } 22 23 Status Pop(LinkStack *s,ElemType *e) 24 { 25 LinkStackPtr p; 26 if(StackEmpty(*s)) 27 { 28 return ERROR; 29 } 30 *e = s->top->data; 31 p = s->top; 32 s->top = s->top->next; 33 free(p); 34 s->count--; 35 return OK; 36 } 37 38 39 可执行代码来自https://blog.csdn.net/sinat_35297665/article/details/79489822 40 #include <iostream> 41 42 using namespace std; 43 44 typedef struct node{ 45 46 int data; 47 48 struct node *next; 49 50 }Node; 51 52 53 54 typedef struct stack{ 55 56 Node *top; /**书本写法是:加一个bottom,个人感觉没什么用,反而加一个count用于表示节点数会更好*/ 57 58 int count; 59 60 }Link_Stack; 61 62 63 64 /**创建一个空栈*/ 65 66 Link_Stack * Creat_stack() 67 68 { 69 70 Link_Stack *p; 71 72 p = new Link_Stack; /**这一步不要忘!需要给p创建空间*/ 73 74 p->count = 0; 75 76 p->top = NULL; 77 78 79 80 return p; 81 82 } 83 84 85 86 /**入栈操作:push*/ 87 88 Link_Stack * Push_stack(Link_Stack *p,int elem) 89 90 { 91 92 if(NULL == p) 93 94 return NULL; 95 96 97 98 Node *temp; 99 100 temp = new Node; 101 102 temp->data = elem; 103 104 105 106 temp->next = p->top; /**注意这里和队列的入队操作不同,next指向不同,为了方便出栈操作*/ 107 108 p->top = temp; 109 110 111 112 p->count += 1; 113 114 115 116 return p; 117 118 } 119 120 121 122 /**出栈操作:pop*/ 123 124 Link_Stack * Pop_stack(Link_Stack *p) 125 126 { 127 128 Node *temp; 129 130 temp = p->top; 131 132 if(NULL == p->top) 133 134 { 135 136 cout << "The stack is empty." << endl; 137 138 return p; 139 140 } 141 142 else{ 143 144 p->top = p->top->next; /** temp = temp->next; 千万不能这么写,看看下一步是什么?*/ 145 146 delete temp; 147 148 149 150 p->count -= 1; 151 152 153 154 return p; 155 156 } 157 158 } 159 160 161 162 /**栈的遍历:输出栈*/ 163 164 int Show_stack(Link_Stack *p) 165 166 { 167 168 Node *temp; 169 170 temp = p->top; 171 172 173 174 if(NULL == p->top) 175 176 { 177 178 cout << "The stack is empty." << endl; 179 180 return 0; 181 182 } 183 184 while(NULL != temp) 185 186 { 187 188 cout << temp->data << ‘ ‘; 189 190 temp = temp->next; 191 192 } 193 194 cout << endl; 195 196 197 198 return 0; 199 200 } 201 202 203 204 int main() 205 206 { 207 208 int i = 5; 209 210 int elem; 211 212 Link_Stack *p; 213 214 p = Creat_stack(); 215 216 while(i--) 217 218 { 219 220 cin >> elem; 221 222 Push_stack(p,elem); 223 224 } 225 226 cout << "空栈插入5个元素后:" << endl; 227 228 Show_stack(p); 229 230 231 232 cout << "删除3个元素后:" << endl; 233 234 for(i = 3;i--;) 235 236 { 237 238 Pop_stack(p); 239 240 } 241 242 Show_stack(p); 243 244 cout << "count:" << p->count << endl; 245 246 247 248 cout << "删除2个元素后:" << endl; 249 250 for(i = 2;i--;) 251 252 { 253 254 Pop_stack(p); 255 256 } 257 258 Show_stack(p); 259 260 cout << "count:" << p->count << endl; 261 262 263 264 Push_stack(p,6); 265 266 cout << "插入元素6后:" << endl; 267 268 Show_stack(p); 269 270 cout << "count:" << p->count << endl; 271 272 273 274 return 0; 275 276 }
以上是关于栈与队列:栈的链式储存结构的主要内容,如果未能解决你的问题,请参考以下文章