队列总结:
队列是一种特殊的线性结构,他只允许在队列的首部进行删除操作,称为出队,在尾部进行插入操作,称为入队。原则是先进先出 。
代码如下下:
#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;
}
以上内容均为个人总结,如有错误,感谢指正。**