网站托管是什么意思,网站开发神书,武清区网站开发,wordpress图片外链插件数据结构【线性表篇】(四#xff09; 文章目录 数据结构【线性表篇】(四#xff09;前言为什么突然想学算法了#xff1f;为什么选择码蹄集作为刷题软件#xff1f; 目录一、栈(一)、栈的顺序存储(二)、栈的链式存储(三)、共享栈 二、队列(一)、队列的顺序存储(二)、队列的…数据结构【线性表篇】(四 文章目录 数据结构【线性表篇】(四前言为什么突然想学算法了为什么选择码蹄集作为刷题软件 目录一、栈(一)、栈的顺序存储(二)、栈的链式存储(三)、共享栈 二、队列(一)、队列的顺序存储(二)、队列的链式存储 三、结语 前言 为什么突然想学算法了 用较为“官方”的语言讲是因为算法对计算机科学的所有分支都非常重要。 在绝大多数的计算机科学分支领域中要想完成任何实质性的工作理解算法的基础知识并掌握与算法密切相关的数据结构知识是必不可少的。 但从实际而言是因为当下竞争压力逐渐增大无论走哪一条路都不免需要一些相对丰富的算法知识是故便产生了一个寒假巩固速成算法的计划可能对于像我这种算法竞赛小白而言几乎很难但我仍然还是想尝试一下毕竟梦想还是要有的万一实现了呢(▽)~ 为什么选择码蹄集作为刷题软件 码蹄集是在全国高等学校计算机教学与产业实践资源建设专家委员会(TIPCC) 指导下建设的其依托全国各大名校计算机系和清华大学出版社等单位的强大资源旨在为计算机学习爱好者提供全面和权威的计算机习题。 . 目录
一、栈
(一)、栈的顺序存储
参考代码
//顺序栈
#includebits/stdc.h
using namespace std;#define MaxSize 10 //定义栈中元素的最大个数//顺序存储给各个数据元素分配连续的存储空间大小为MaxSize*sizeof(ElemType)
typedef struct{int data[MaxSize]; //静态数组存放栈中元素int top; //栈顶指针
}SqStack;void InitStack(SqStack S){S.top -1; //初始化栈顶指针//也可以使其等于0然后判空时把-1改为0
}//判断栈空
bool SqStackEmpty(SqStack S){if(S.top-1) return true;else return false;
}//新元素入栈
bool Push(SqStack S,int x){if(S.topMaxSize-1) //栈满(topMaxSize)报错return false;S.top S.top1; //指针先加1S.data[S.top]x; //新元素入栈//上两句等价于S.data[S.top]x; *注意S.top而不是S.topreturn true;
}//出栈操作
int Pop(SqStack S){int x;if(S.top-1) //栈空报错,返回-1return -1;x S.data[S.top]; //栈顶元素先出栈S.top S.top-1; //指针再减1//上两句等价于x S.data[S.top--];return x;
}//读栈顶元素
int GetTop(SqStack S){int x;if(S.top-1) //栈顶报错返回-1return -1;xS.data[S.top]; //x记录栈顶元素return x;
}void testSqStack(){SqStack S; //声明一个顺序栈(分配空间)InitStack(S); //初始化栈Push(S,1); //新元素入栈Push(S,2);Push(S,3);if(!SqStackEmpty(S)){ //判断栈空cout栈非空endl;}else cout栈空endl;int x GetTop(S); //读取栈顶元素xcoutxendl;int x1 Pop(S); //弹出栈顶元素x1coutx1endl;int x2 GetTop(S); //读取栈顶元素x2coutx2endl;}
int main(){testSqStack();return 0;
}(二)、栈的链式存储
#includebits/stdc.h
using namespace std;typedef struct Linknode{int data; //数据域struct Linknode *next; //指针域
} *LiStack;int main(){return 0;
} (三)、共享栈
#includebits/stdc.h
#define MaxSize 10 //定义栈中元素的最大个数
typedef struct {int data[MaxSize]; //静态数组存放栈中元素int top0; //0号栈栈顶指针int top1; //1号栈栈顶指针
}ShStack;//初始化栈
void InitStack(ShStack S){S.top0 -1; //初始化栈顶指针S.top1 MaxSize;
}//栈满的条件top01top1二、队列
(一)、队列的顺序存储
#includebits/stdc.h
using namespace std;
#define MaxSize 10 //定义队列中元素的最大个数
typedef struct{int data[MaxSize]; //用静态数组存放队列元素int front,rear; //队头指针和队尾指针
}SqQueue;//初始化队列
void InitQueue(SqQueue Q){//初始时队头、队尾指针指向0Q.rearQ.front0;
}//判断队列是否为空
bool SqQueueEmpty(SqQueue Q){if(Q.rearQ.front) //队空条件return true;else return false;
}//入队
bool EnQueue(SqQueue Q,int x){if(Q.rearMaxSize-1) return false; //队满则报错//if((Q.rear1)%MaxSizeQ.front) //循环队列Q.data[Q.rear]x; //将x插入队尾Q.rearQ.rear1; //队尾指针后移//Q.rear(Q.rear1)%MaxSize; //循环队列——队尾指针加1取模return true;
}//循环队列——出队删除一个队头元素并用x返回
bool DeQueue(SqQueue Q,int x){if(Q.rearQ.front) return false;x Q.data[Q.front];Q.front(Q.front1)%MaxSize;return true;
}//获得头元素的值用x返回
bool GetHead(SqQueue Q,int x){if(Q.rearQ.front) return false; //队空则报错x Q.data[Q.front];return true;
}void testQueue(){SqQueue Q; //声明一个队列顺序存储InitQueue(Q); //初始化队列if(SqQueueEmpty(Q)) cout队列为空endl;else cout队列非空endl;EnQueue(Q,1); //入队EnQueue(Q,2);EnQueue(Q,3);if(SqQueueEmpty(Q)) cout队列为空endl;else cout队列非空endl;int x;GetHead(Q,x); //获取头元素的值coutxendl;DeQueue(Q,x); //出队coutxendl;GetHead(Q,x); //获取更新后的头元素的值coutxendl;}int main(){testQueue();return 0;
}(二)、队列的链式存储
#includebits/stdc.h
using namespace std;
#define Maxsize 10typedef struct LinkNode{ //链式队列结点int data;struct LinkNode *next;
}LinkNode;typedef struct{ //链式队列LinkNode *front,*rear; //队列的队头和队尾指针
}LinkQueue;//初始化队列(带头结点)
void InitQueueWithNode(LinkQueue Q){//初始时 front、rear都指向头结点Q.frontQ.rear(LinkNode*) malloc(sizeof(LinkNode));Q.front-nextNULL;
}bool IsEmptyWithNode(LinkQueue Q){if(Q.frontQ.rear) return true;else return false;
}//初始化队列(不带头结点)
void InitQueueWithoutNode(LinkQueue Q){//初始时 front、rear都指向NULLQ.frontNULL;Q.rearNULL;
}//判断队列是否为空(不带头结点)
bool IsEmptyWithoutNode(LinkQueue Q){if(Q.frontNULL) return true;else return false;
}//新元素入队(带头结点)
void EnQueueWithNode(LinkQueue Q,int x){LinkNode *s (LinkNode *) malloc(sizeof(LinkNode));s-datax;s-nextNULL;Q.rear-nexts; //新结点插入到rear之后Q.rears; //修改表尾指针
}//队头元素出队(带头结点)
bool DeQueueWithNode(LinkQueue Q,int x){if(Q.frontQ.rear)return false; //空队LinkNode *pQ.front-next;xp-data; //用变量x返回队头元素Q.front-nextp-next; //修改头结点的next指针if(Q.rearp) //此次是最后一个结点出队Q.rearQ.front; //修改rear指针free(p); //释放结点空间return true;
}//队头元素出队(不带头结点)
bool DeQueueWithoutNode(LinkQueue Q,int x){if(Q.frontNULL)return false; //空队LinkNode *pQ.front; //p指向此次出队的结点xp-data; //用变量x返回队头元素Q.frontp-next; //修改front指针if(Q.rearp) { //此次是最后一个结点出队Q.frontNULL; //front指向NULLQ.rearNULL; //rear指向NULL}free(p); //释放结点空间return true;
}//新元素入队(不带头结点)
void EnQueueWithoutNode(LinkQueue Q,int x){LinkNode *s (LinkNode *) malloc(sizeof(LinkNode));s-datax;s-nextNULL;if(Q.frontNULL){ //在空队列中插入第一个元素Q.front s; //修改队头队尾指针Q.rear s;}else{Q.rear-nexts; //新结点插入到rear结点之后Q.rears; //修改rear指针}
}//获得头元素的值用x返回
bool GetHead(LinkQueue Q,int x){if(Q.rearQ.front) return false; //队空则报错LinkNode *pQ.front-next;xp-data;return true;
}void testLinkQueue(){LinkQueue Q; //声明一个队列InitQueueWithNode(Q); //初始化队列if(IsEmptyWithNode(Q)) cout队列为空endl;else cout队列非空endl;EnQueueWithNode(Q,1); //入队EnQueueWithNode(Q,2);EnQueueWithNode(Q,3);if(IsEmptyWithNode(Q)) cout队列为空endl;else cout队列非空endl;int x; //出队x返回出队元素DeQueueWithNode(Q,x);coutxendl;GetHead(Q,x); //获取出队后的队头元素xcoutxendl;
}int main(){testLinkQueue();return 0;
}三、结语
感谢大家一直以来的不断支持与鼓励码题集题库中的进阶塔350题正在逐步更新之后会逐步跟进星耀王者的题尽请期待 同时也希望这些题能帮助到大家一起进步祝愿每一个算法道路上的“苦行僧”们都能够历经磨难终成正果既然选择了这条路走到了这里中途放弃岂不是太过可惜
另附中国计算机学会的杰出会员、常务理事轩哥博士的B站视频讲解链接https://space.bilibili.com/518554541/?spm_id_from333.999.0.0供大家更好的进行学习与刷题(▽)~
愿你的结局配得上你一路的颠沛流离。