队列与栈算法总结

本文深入解析队列和栈两种数据结构的原理与应用,包括先进先出(FIFO)和后进先出(LIFO)的原则,以及它们在算法如广度优先搜索和Bellman-Ford最短路径算法中的作用。通过具体代码示例,阐述队列的入队与出队操作,以及栈的压栈与弹栈过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

队列总结

队列是一种特殊的线性结构,他只允许在队列的首部进行删除操作,称为出队,在尾部进行插入操作,称为入队。原则是先进先出
代码如下下:

#include <iostream>
using namespace std;
int main() 
{     
 	int q[102]={0,6,3,1,7,5,8,9,2,4},head,tail;     
 	int i;    
 	head=1;      tail=10;  
 	while(head<tail)      
 		{
			cout<<q[head]<<' ';         head++; //出列
			q[tail]=q[head];         //入列
 			tail++; head++;     
		 }             
return 0; 
} 

附:
队列是学习广度优先搜索以及队列优化的Bellman-Ford最短路算法的核心数据结构。之前学习的冒泡算法并不实用。

栈总结:

后进先出原则,栈限定只能在一端进行插入和删除操作。

一、
下面这个例子的难点就在于中值mid和对比值next 的求解,这两个值我们换一种理解方式可能就通了。首先我们要清楚自己的思路,栈的思路就是,将中值之前的内容入栈,跟后面进行依次对比,那么在入栈时要有一个界限值,表示到此入栈完毕,即为mid;在计算一个起始值,表示从哪里开始对比,即为next。
我们结合例程来看:(建议思考同时在草纸上肆意描摹)

char a[101],s[101];
int i,len,mid,next,top;
cin>>a;
len=strlen(a);
mid=len/2-1;         //难点一

top=0;   //栈初始化
for(i=0;i<=mid;i++)			//终止值mid
s[++top]=a[i];                               //入栈

if(len%2==0)                              //难点二
	next=mid+1;
else
	next=mid+2;
//开始对比
for(i=next;i<=len-1;i++)         //起始值next
{
	if(a[i]!=s[top])
	break;
	top--;
}
if(top==0)				//表示恰好对比完
	cout<<"yes";
else
	cout<<"no";
return 0;	

下面我们来详细说说mid 与next求法:
mid:
我们是用数组来操作,所以不要忽略0的存在。设我们要比对一个长度为7的内容,那么我们只需要将前三个入栈即可,再来表述一遍入栈操作如下

for(i=0;i<=mid;i++)
s[++top]=a[i];

前三个即a[0],a[1],a[2].mid表示的并非是次序,而是在数组中的下标。所以mid=len/2-1,无论长度奇偶。
next:
mid求解之后,我们运用小学生的知识即可算出next,如果长度是奇数,那么会存在一个中间值,比如12345中的3,我们要跳过;长度为偶数则直接用mid与下一位比较就可以了。

二、相关概念
(1)栈顶与栈底:允许元素插入与删除的一端称为栈顶,另一端为栈底。
(2)压栈:栈的插入操作,叫做进栈,也称入栈、压栈。
(3)弹栈:栈的删除操作,也叫出栈。
(4)求栈的大小
(5)获取栈顶元素的值
(6)判断栈是否为空
三、栈的常见分类
(1)基于数组的栈
以数组为底层数据结构时,通常以数组头为栈底,数组头到数组尾为栈顶的生长方向
(2)基于单链表的栈
以链表为底层的数据结构时,以链表头为栈顶,便于节点的插入与删除,压栈产生的新节点将一直出现在链表的头部

实例分析
在栈中应包含头文件:#include<stack>。定义:stack<int>s;

s.empty();		//如果栈为空则返回true,否则返回false
s.size();		//返回栈中元素的个数
s.top();		//返回栈顶元素,但不删除该元素
s.pop();		//弹出栈顶元素,但不返回其值
s.push();		//将元素压入栈顶

话不多说,请看例程
目的:用栈实现输入一组数,以零做结束,倒序输出

#include<iostream>
#include<stack>//STL stack的头文件
using namespace std;
stack<int>a;//定义一个int型的stack
int c;
int main(){
		while(1){
			cin>>c;
			if(c==0)  break;
			a.push(c);//将括号里的元素压入stack顶部
			   }
		while(!a.empty()){
				cout<<a.top()<<" ";返回stack顶部元素
				a.pop();//删除顶部元素
					}
				return 0;
		}

以上内容均为个人总结,如有错误,感谢指正。**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值