数据结构 (一)

开始学数据结构了,听老师说数据结构总共要4学分,就知道不是特别好学,但是总体来说都是一些概念性的知识,还没有大规模做相关的题,所以还是先从理解概念开始,只学有关于ACM里相关的数据结构知识,对以后大二的学习帮助应该也是很大的。

一、栈

栈在STL里边就有学过(stack),数据结构主要讲了更加原理性的知识,栈是只能在某一端插入和删除的特殊线性表,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。
一个栈可以用定长为N的数组S来表示,用一个栈指针TOP指向栈顶。若TOP=0,表示栈空,TOP=N时栈满。进栈时TOP加1。退栈时TOP减1。当TOP<0时为下溢。栈指针在运算中永远指向栈顶。
在这里插入图片描述
曾经对于栈在STL里的描述:
https://blog.csdn.net/qq_43656233/article/details/87930289

1、进栈(PUSH)算法
2、退栈(POP)算法

#define n 100
void push(int s[],int *top,int *x)  //入栈
{
   if (*top==n) printf("overflow"); 
     else { (*top)++; s[*top]=*x; }
}
void pop(int s[],int *y,int *top)   //出栈
{
   if (*top==0)  printf("underflow");  
     else { *y=s[*top]; (*top)--; }
}

二、队列

队列(queue)和栈遥相对应,队列是限定在一端进行插入,另一端进行删除特殊线性表。
队列的删除和插入分别称为出队和入队。允许出队的一端称为队头,允许入队的一端称为队尾。
于总是先入队的元素先出队(先排队的人先买完东西),这种表也称为先进先出(FIFO)表。
队列可以用数组Q[m+1]来存储,数组的上界m即是队列所容许的最大容量。在队列的运算中需设两个指针:
head:队头指针,指向实际队头元素的前一个位置
tail:队尾指针,指向实际队尾元素所在的位置
在这里插入图片描述
克服假溢出的方法有两种。一种是将队列中的所有元素均向低地址区移动,显然这种方法是很浪费时间的;另一种方法是将数组存储区看成是一个首尾相接的环形区域。当存放到n地址后,下一个地址就"翻转"为1。在结构上采用这种技巧来存储的队列称为循环队列,见图2
在这里插入图片描述
循环队的入队算法如下:

1、tail=tail+1;
 2、若tail=n+1,则tail=1;    
 3、若head=tail尾指针与头指针重合了,表示元素已装满队列, 则作上溢出错处理;    
 4、否则,Q[tail]=x,结束(x为新入出元素)。

对于队列在STL里的表述:
https://blog.csdn.net/qq_43656233/article/details/88095457

总而言之栈和队列是非常重要的数据结构知识,对于以后大量的题都是通过栈和队列的操作进行的,其中的入栈出栈入队列出队列都要熟练运用,这样才算打好基础吧~

发布了90 篇原创文章 · 获赞 15 · 访问量 3136

猜你喜欢

转载自blog.csdn.net/qq_43656233/article/details/89977102