队列(queue)是一种先进先出的数据结构
队列是一种特殊的线性结构,它只允许删除队列的首部(head),这称为“出队”,当插入元素时,只能在队列的尾部(tail)进行操作,这称为“入队”。当队列中没有元素时(即 head==tail),称为“空队列”。在我们的日常生活中有很多情况都符合队列的特性。比如买票, 我们可以把每个排队买票的窗口当成一个队列。在这个队列当中,来得越早的人越靠前,也就越早能买到票,就是先来的人先服务,我们称为“先进先出”(First In First Out,FIFO)原则
栈(stack)则是一种后进先出的数据结构。(堆栈最早是艾伦·图灵于1946提出)
如弹匣最后压进去的那一颗子弹是最先发射出去的。
栈不仅仅是一种算法,它代表的是一种思想。可以struck栈,也可以把栈的思想与其他算法结合起来获得更加简洁的代码。
栈的头文件为#include<stack>
定义栈
如:
struct stack
{
Int XXX;
}
或
struck queue q1 …;
栈有以下的常用操作:
q.push(x); //将x压入栈顶
q.top(); //返回栈顶的元素
q.pop(); //删除栈顶的元素
q.size(); //返回栈中元素的个数
q.empty(); //检查栈是否为空,若为空返回true,否则为false
当确定栈结构后,每次运用栈中的词都需要读取号。如上方的q.XXX()
我们可以用栈的特性来解密回文(代码如下):
#include<bits/stdc++.h>
using namespace std;
int main()
{
char a[101],s[101];
int i,len,mid,next,top;
gets(a);//读入一行字符串
/*在前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数.
gets() 比 scanf 简洁,就算输入的字符串中有空格也可以直接输入*/
len=strlen(a);//求字符串长度
mid=len/2-1;//求字符串的中点
top=0;//初始化栈
//将mid前的字符依次入栈
for(i=0;i<=mid;i++)
s[++top]=a[i];
//判断字符串的长度是奇数还是偶数,并找出需要进行字符匹配的起始下标
if(len%2==0)
next=mid+1;
else
next=mid+2;
//开始匹配
for(i=next;i<=len-1;i++)
{
if(a[i]!=s[top])
break;
top--;
}
//如果top的值为0,则说明栈内所以的字符都被一一匹配了
if(top==0)
cout<<"YES";
else
cout<<"NO";
}
同时贯彻本文思想,可以把队列与栈结合起来
代码如下(部分):
#include<bits/stdc++.h>
using namespace std;
struct queue
{
int data[1000];
int head;
int tail;
};
struct stack
{
int data[10];
int top;
};
int main()
{
struct queue q1,q2;
struct stack s;
int book[10];
int i,t;
//初始化队列
q1.head=1; q1.tail=1;
q2.head=1; q1.tail=1;
//初始化栈
s.top=0;
}
其中struct queue 为定义队列数据结构体
head 用来存储队头,tail 用来存储队尾,data用来存储队列元素。
而struct stack 为定义栈
top用来存储栈顶,data用来存储栈元素。
下面的代码:
struct queue q1,q2;
struct stack s;
q1 q2是定义队列变量,s是栈变量
后面的
q1.head=1; q1.tail=1;
q2.head=1; q1.tail=1;
s.top=0;
则是读取队列变量元素以及栈变量元素的格式