实验二 栈、队列
(1)实验内容
1.采用链式存储实现栈的初始化、入栈、出栈操作。
2.采用顺序存储实现栈的初始化、入栈、出栈操作。
3.采用链式存储实现队列的初始化、入队、出队操作。
4.采用顺序存储实现循环队列的初始化、入队、出队操作。
5.在主函数中设计一个简单的菜单,分别测试上述算法。
*6.综合训练:1)利用栈实现表达式求值算法。
2)利用栈实现迷宫求解。
1 #include <iostream> 2 #include <stdio.h> 3 #include <stdlib.h> 4 #define MAXSIZE 100 5 #define OVERFLOW -2 6 using namespace std; 7 //顺序栈 8 typedef int Elemtype; 9 typedef struct { 10 Elemtype elem[MAXSIZE]; 11 int top; 12 }SeqStack; 13 void initSeqStack(SeqStack &s){ 14 s.top=-1; 15 } 16 int stackEmpty(SeqStack &s){ 17 if (s.top==-1) 18 return 1; 19 return 0;//或者返回 表达式的真值return s.top==-1; 20 } 21 int push(SeqStack &s,Elemtype e){ 22 if (s.top>=MAXSIZE-1) 23 return 0; 24 else { 25 s.top++; 26 s.elem[s.top]=e; 27 return 1; 28 } 29 } 30 int pop(SeqStack &s,Elemtype &e){ 31 if (s.top==-1) 32 return 0; 33 else { 34 e=s.elem[s.top]; 35 s.top--; 36 return 1; 37 } 38 } 39 int gettop(SeqStack &s,Elemtype &e){ 40 if (s.top==-1) 41 return 0; 42 else { 43 e=s.elem[s.top]; 44 return 1; 45 } 46 } 47 void display(SeqStack &s){ 48 for (int i=0;i<=s.top;i++){ 49 cout<<s.elem[i]<<" "; 50 } 51 cout<<endl; 52 } 53 54 //链栈 55 typedef struct node { 56 Elemtype data; 57 struct node *next; 58 }node,*linkstack; 59 void initLinkstack(linkstack &top){ 60 top=NULL;//无头节点的链栈 61 } 62 int linkstackEmpty(linkstack &top){ 63 return top==NULL; 64 } 65 int linkstackPush(linkstack &top,Elemtype e){ 66 linkstack p=(linkstack )malloc (sizeof(node)); 67 if (!p) exit(OVERFLOW); 68 p->data=e; 69 p->next=top; 70 top=p; 71 return 1; 72 } 73 int linkstackPop(linkstack &top,Elemtype &e){ 74 e=top->data; 75 linkstack p=top; 76 top=top->next; 77 free(p); 78 return 1; 79 } 80 void getTop(linkstack &top,Elemtype &E){ 81 E=top->data; 82 } 83 void displaylinkstack(linkstack &top){ 84 linkstack p=top; 85 while (p){ 86 printf ("%d ",p->data); 87 p=p->next; 88 } 89 printf (" "); 90 } 91 //顺序循环队列 92 typedef int Elemtype; 93 typedef struct{ 94 Elemtype data[MAXSIZE]; 95 int rear,front; 96 }Seqqueue; 97 void initSeqqueue(Seqqueue &q){ 98 q.rear=q.front=-1; 99 } 100 int emptySeqqueue(Seqqueue &q){ 101 return q.rear==q.front; 102 } 103 int enSeqqueue(Seqqueue &q,Elemtype e){ 104 //先判断是否队满 105 if ((q.rear+1)%MAXSIZE==q.front){ 106 printf ("full! "); 107 return 0; 108 } 109 q.rear=(q.rear+1)%MAXSIZE; 110 q.data[q.rear]=e; 111 return 1; 112 } 113 int deSeqqueue(Seqqueue &q,Elemtype &e){ 114 if (emptySeqqueue(q)){ 115 printf ("null! "); 116 return 0; 117 } 118 q.front=(q.front+1)%MAXSIZE; 119 e=q.data[q.front]; 120 return 1; 121 } 122 Elemtype getFront(Seqqueue &q){ 123 if (emptySeqqueue(q)){ 124 printf ("null! "); 125 } 126 else { 127 Elemtype e; 128 q.front=(q.front+1)%MAXSIZE; 129 e=q.data[q.front]; 130 return e; 131 } 132 } 133 int length(Seqqueue &q){ 134 return (q.rear-q.front+MAXSIZE)%MAXSIZE; 135 } 136 void display(Seqqueue &q){ 137 if (emptySeqqueue(q)){ 138 printf ("null! "); 139 } 140 else { 141 int i=(1+q.front)%MAXSIZE; 142 for (int j=0;j<length(q);j++){ 143 printf ("%d ",q.data[i]); 144 i++; 145 } 146 printf (" "); 147 } 148 } 149 150 151 //链队列 152 typedef int Elemtype; 153 typedef struct qnode { 154 Elemtype data; 155 struct qnode *next; 156 }qnode,*Queueptr; 157 typedef struct { 158 Queueptr front ; 159 Queueptr rear; 160 }linkQueue; 161 int initQueue(linkQueue &q){ 162 Queueptr lq=(Queueptr)malloc(sizeof(qnode)); 163 if (!lq) exit(OVERFLOW); 164 lq->next=NULL; 165 q.front=q.rear=lq; 166 } 167 int isempty(linkQueue q){ 168 return q.front==q.rear; 169 } 170 int enterQueue(linkQueue &q,Elemtype e){ 171 Queueptr p=(Queueptr)malloc(sizeof(qnode)); 172 if (!p) exit(OVERFLOW); 173 p->data=e; 174 p->next=q.rear->next; 175 q.rear->next=p; 176 q.rear=p; 177 return 1; 178 } 179 int deQueue(linkQueue &q,Elemtype &e){ 180 //出队依旧要判空,入队不需要判满了 181 if (q.rear==q.front){ 182 printf("null "); 183 return 0; 184 } 185 Queueptr p=q.front->next; 186 e=p->data; 187 q.front->next=p->next; 188 //这里要特别注意如果链表中唯一的元素要出队,尾指针必须要重新指向头结点,不然丢失该指针了 189 if (q.front->next==NULL){//或者q.rear==p; 190 q.rear=q.front; 191 } 192 free(p); 193 return 1; 194 } 195 void display(linkQueue &q){ 196 Queueptr p=q.front->next; 197 while (p){ 198 cout<<p->data<<" "; 199 p=p->next; 200 } 201 cout<<endl; 202 } 203 int main() 204 { 205 SeqStack s; 206 Elemtype e; 207 linkstack top; 208 Seqqueue q; 209 linkQueue Q; 210 211 cout<<"---------------------------------------------------"<<endl; 212 cout<<"1.采用顺序存储实现栈的初始化、入栈、出栈操作"<<endl; 213 cout<<"2.采用链式存储实现栈的初始化、入栈、出栈操作"<<endl; 214 cout<<"3.采用顺序存储实现队列的初始化、入队、出队操作"<<endl; 215 cout<<"4.采用链式存储实现循环队列的初始化、入队、出队操作"<<endl; 216 cout<<"---------------------------------------------------"<<endl; 217 int x,i; 218 cout<<"请输入您的选择!"<<endl; 219 while (cin>>x){ 220 switch(x){ 221 case 1:{ 222 initSeqStack(s); 223 cout<<"初始化顺序栈成功!"<<endl; 224 cout<<"请输入压栈的内容!"<<endl; 225 cin>>i; 226 while (i!=-999){ 227 push(s,i); 228 cin>>i; 229 } 230 cout<<"压栈成功!显示栈内数字!"<<endl; 231 display(s); 232 cout<<"获取栈顶元素!"<<endl; 233 gettop(s,e); 234 printf ("%d ",e); 235 cout<<"弹栈!"<<endl; 236 while (s.top>0){ 237 pop(s,e); 238 cout<<"弹出元素:"<<e<<" "; 239 } 240 cout<<endl; 241 cout<<"显示栈内数字!"<<endl; 242 display(s); 243 break; 244 } 245 case 2: 246 initLinkstack(top); 247 cout<<"初始化链栈成功!"<<endl; 248 cout<<"请输入压栈的内容!"<<endl; 249 cin>>i; 250 while (i!=-999){ 251 linkstackPush(top,i); 252 cin>>i; 253 } 254 255 cout<<"压栈成功!显示栈内数字!"<<endl; 256 displaylinkstack(top); 257 cout<<"获取栈顶元素!"<<endl; 258 getTop(top,e); 259 printf ("%d ",e); 260 while (top){ 261 linkstackPop(top,e); 262 cout<<"弹出元素:"<<e<<" "; 263 } 264 cout<<endl; 265 cout<<"显示栈内数字!"<<endl; 266 displaylinkstack(top); 267 break; 268 case 3: 269 initSeqqueue(q); 270 cout<<"初始化顺序队列成功!"<<endl; 271 cout<<"请输入进队的内容!"<<endl; 272 cin>>i; 273 while (i!=-999){ 274 enSeqqueue(q,i); 275 cin>>i; 276 } 277 cout<<"进队成功!显示队内数字!"<<endl; 278 display(q); 279 cout<<"返回队头元素!"<<endl; 280 e=getFront(q); 281 cout<<e<<endl; 282 while (!emptySeqqueue(q)){ 283 deSeqqueue(q,e); 284 cout<<"出队元素"<<e<<" "; 285 } 286 cout<<endl; 287 cout<<"显示队内数字"<<endl; 288 display(q); 289 break; 290 case 4: 291 initQueue(Q); 292 cout<<"初始化链队列成功!"<<endl; 293 cout<<"请输入进队的内容!"<<endl; 294 cin>>i; 295 while (i!=-999){ 296 enterQueue(Q,i); 297 cin>>i; 298 } 299 cout<<"进队成功!显示队内数字!"<<endl; 300 display(Q); 301 302 while (!isempty(Q)){ 303 deQueue(Q,e); 304 cout<<"出队元素"<<e<<" "; 305 } 306 cout<<endl; 307 cout<<"显示队内数字"<<endl; 308 display(Q); 309 break; 310 } 311 cout<<"请输入您的选择!"<<endl; 312 } 313 314 return 0; 315 }