数据结构笔记2---栈与队列
来源:互联网 发布:linux 启动进度条 编辑:程序博客网 时间:2024/05/16 16:08
导读
1.栈的数组模式
2.双堆栈模式(数组)
3.栈的链表模式
4.队列的数组模式
5.循环队列(数组)
6.队列链表模式
栈的数组模式
#include <iostream>using namespace std;#define MAXSIZE 100struct Stack{ int data[MAXSIZE]; int Top;};typedef Stack *stc;//创建stc init(){ stc stack=new Stack; stack->Top=-1; return stack;}//入栈void Push(stc &stack,int data){ if(stack->Top==MAXSIZE-1){ cout<<"It's full!"<<endl; } else{ stack->data[++(stack->Top)]=data; }}//出栈int Pop(stc &stack){ if(stack->Top==-1){ cout<<"It's empty!"<<endl; return NULL; }else{ return (stack->data[(stack->Top)--]); }}int main(){ stc stack; stack=init(); Push(stack,1); int a=Pop(stack); cout<<a<<endl; return 0;}
输出结果
1
Program ended with exit code: 0
双堆栈模式(数组)
//双堆栈思路:以两端为堆栈底,从两头向中间入栈,当栈顶指针相遇时为栈满。//为何不是从中间向两端入栈呢?避免一个栈已满,另一个栈还有很多空间#include <iostream>using namespace std;#define MAXSIZE 100struct DStack{ int data[MAXSIZE]; int Top1; int Top2;};typedef struct DStack *stc;//创建stc init(){ stc Dstack=new DStack; Dstack->Top1=-1; Dstack->Top2=MAXSIZE; return Dstack;}//插入数据void Push(stc &Dstack,int data,int flag){ if(Dstack->Top2-Dstack->Top1==1){ cout<<"It's full!"<<endl; return ; } //flag=1插入堆栈1,反之插入堆栈2 if(flag==1){ Dstack->data[++(Dstack->Top1)]=data; } else Dstack->data[--(Dstack->Top2)]=data;}//删除数据int Pop (stc &Dstack,int flag){ if(flag==1){ if(Dstack->Top1==-1){ cout<<"It's empty!"<<endl; return NULL; } else{ return (Dstack->data[(Dstack->Top1)--]); } } else{ if(Dstack->Top2==MAXSIZE){ cout<<"It's empty!"<<endl; return NULL; } else return (Dstack->data[(Dstack->Top2)++]); }}int main(){ stc Dstack; Dstack=init(); cout<<Pop(Dstack,1)<<endl; for(int i=1;i<=10;i++){ Push(Dstack,i,1); Push(Dstack,i,2); } cout<<Pop(Dstack,2)<<endl; cout<<Pop(Dstack,1)<<endl; return 0;}
输出结果
It’s empty!
0
10
10
Program ended with exit code: 0
栈的链表模式
⚠️头指针不存放数据
#include <iostream>using namespace std;typedef struct SNode *snode;struct SNode{ int data; snode next;};//创建snode init(){ snode Stack=new SNode; Stack->next=NULL; return Stack;}//入栈void Push(snode &Stack,int data){ snode s=new SNode; s->data=data; s->next=Stack->next; Stack->next=s;}//出栈int Pop(snode &Stack){ snode s; int result; if(Stack->next==NULL){ cout<<"It's empty!"<<endl; return NULL; } else{ s=Stack->next; Stack->next=Stack->next->next; result=s->data; delete(s); return result; }}//判空bool Isempty(snode Stack){ bool flag; if(Stack->next==NULL) flag=true; else flag=false; return flag;}int main(){ snode Stack; Stack=init(); cout<<Pop(Stack)<<endl; for(int i=1;i<=10;i++) Push(Stack,i); while(!Isempty(Stack)){ cout<<Pop(Stack)<<" "; } cout<<endl; return 0;}
输出结果
It’s empty!
0
10 9 8 7 6 5 4 3 2 1
Program ended with exit code: 0
队列的数组模式
#include <iostream>using namespace std;#define MAXSIZE 50typedef struct QNode *queue;struct QNode{ int data[MAXSIZE]; int front; int rear;};//创建queue init(){ queue queue=new QNode; queue->front=-1; queue->rear=-1; return queue;}//入队void Push(queue &queue,int data){ if(queue->rear==MAXSIZE-1) cout<<"It's full!"<<endl; else queue->data[++(queue->rear)]=data;}//出队int Pop(queue &queue){ if(queue->front==queue->rear){ cout<<"It's empty!"<<endl; return NULL; } else{ return (queue->data[++(queue->front)]); }}//判空bool Isempty(queue queue){ bool flag; if(queue->front==queue->rear) flag=true; else flag=false; return flag;}int main(){ queue queue; queue=init(); cout<<Pop(queue)<<endl; for(int i=1;i<=10;i++){ Push(queue,i); } while(!Isempty(queue)){ cout<<Pop(queue)<<" "; } cout<<endl; return 0;}
输出结果
It’s empty!
0
1 2 3 4 5 6 7 8 9 10
Program ended with exit code: 0
循环队列(数组)
#include <iostream>using namespace std;#define MAXSIZE 5typedef struct QNode *queue;struct QNode{ int data[MAXSIZE]; int front; int rear;};//创建queue init(){ queue queue=new QNode; queue->front=-1; queue->rear=-1; return queue;}//入队void Push(queue &queue,int data){ if((queue->rear+1)%MAXSIZE==queue->front) //+1的目的是判断循环队列是否放满 cout<<"It's full!"<<endl; else{ queue->rear=(queue->rear+1)%MAXSIZE; //取余法是实现循环的关键 queue->data[queue->rear]=data; }}//出队int Pop(queue &queue){ if(queue->front==queue->rear){ cout<<"It's empty!"<<endl; return NULL; } else{ queue->front=(queue->front+1)%MAXSIZE; return queue->data[queue->front]; }}//判空bool Isempty(queue queue){ bool flag; if(queue->front==queue->rear) flag=true; else flag=false; return flag;}int main(){ queue queue; queue=init(); cout<<Pop(queue)<<endl; for(int i=1;i<=5;i++){ Push(queue,i); } while(!Isempty(queue)){ cout<<Pop(queue)<<" "; } cout<<endl; return 0;}
输出结果
It’s empty!
0
1 2 3 4 5
Program ended with exit code: 0
队列链表模式
⚠️头指针不放数据
#include <iostream>using namespace std;//普通节点typedef struct Node *node;struct Node{ int data; node next;};//表示队列的结构typedef struct QNode *queue;struct QNode{ node front; node rear;};//创建queue init(){ node head=new Node; queue queue=new QNode; queue->front=queue->rear=head; head->next=NULL; return queue;}//入队void Push(queue &queue,int data){ node node=new Node; node->data=data; node->next=queue->rear->next; queue->rear->next=node; queue->rear=queue->rear->next;}//判空bool Isempty(queue queue){ bool flag; if(queue->front->next==NULL) flag=true; else flag=false; return flag;}//出队int Pop(queue &queue){ int result; if(Isempty(queue)){ cout<<"It's empty!"<<endl; return NULL; } else{ node node; node=queue->front->next; queue->front->next=queue->front->next->next; result=node->data; delete(node); if(Isempty(queue)) queue->rear=queue->front; //此处if判断非常重要,目的是在空栈时让rear回到原位 return result; }}int main(){ queue queue; queue=init(); cout<<Pop(queue)<<endl; for(int i=1;i<=10;i++) Push(queue,i); while(!Isempty(queue)) cout<<Pop(queue)<<" "; cout<<endl; return 0;}
输出结果
It’s empty!
0
1 2 3 4 5 6 7 8 9 10
Program ended with exit code: 0
阅读全文
0 0
- 数据结构笔记2---栈与队列
- 数据结构复习笔记二:栈与队列
- 数据结构笔记(3)栈与队列
- 【学习笔记----数据结构05-栈与队列】
- 数据结构与算法学习笔记:栈与队列
- 【数据结构】栈与队列
- 【数据结构】栈与队列
- 数据结构-栈与队列
- [数据结构] 栈与队列
- 【数据结构】栈与队列
- 《大话数据结构》笔记之 第四章 栈与队列
- 学习笔记:数据结构(二)栈与队列
- 课程笔记 11:数据结构(清华) 栈与队列
- 【黑马程序员-学习笔记】数据结构-栈与队列
- 数据结构看书笔记(四)--栈与队列
- 「笔记」《大话数据结构》第四章:栈与队列
- 数据结构学习-栈与队列(2)
- JavaScript数据结构(2):栈与队列
- 前端JavaScript面试技巧全套
- 监控Linq的内部Sql的方法
- EOJ #3452 唐纳德先生和假骰子【暴力】
- 随机森林算法
- 一篇文章看懂iOS代码块Block
- 数据结构笔记2---栈与队列
- yii2 下的redis常用命令集合
- MySQL数据库优化的八种方式
- 6、@Import注解——导入资源
- JavaEE与MVC结合
- ARKit从入门到精通(8)-ARKit捕捉平地
- 值传递和引用传递
- C语言编译过程
- 过去一个月的期中考试总结+noip2017总结