队列与栈
(一)队列
经典例题:一串长为n加密的数字,解密法则如下——将第一个数删除,再把第二个数放到末尾,删除第三个数,将第四个放到末尾。。。。。。直到剩下最后一个数,将最后一个数删除。按照之前删除的顺序,把这些数连在一起便是
源码。
例:所给长为9的数串“6 3 1 7 5 8 9 2 4”
第一步:删6移3——>1 7 5 8 9 2 4 3 6第一个被删,源码6开头
第二步:删1移7——>5 8 9 2 4 3 7 1第二个被删,1在第二位
第三步:删5移8——>9 2 4 3 7 8 5第三个被删,5在第三位
第四步:删9移2——>4 3 7 8 2 9在第四位
第五步:删4移3——>7 8 2 3 4接2后面
第六步:删7移8——>2 3 8 接着是7
第七步:删2移3——>8 3 接着是2
第八步:删8移3——>3 倒数第二位是8
第九步:删3 末尾为3
源码:6 1 5 9 4 7 2 8 3
通常删除一个数后将其他位一次往前挪一位,这样虽节省空间,但太浪费时间。在队列法中我们引入head,tail两个变量,每删除一个数便将head后移一位,每移动一个数便将head和tail都后移一位,移动的数放入tail所对应的单元中,虽然空间会比之前大但大大节省了时间。输入n,之后输入n位数字。
head tail
定义数组q[] 1 2 3 4 5 6 7 8 9 10 初始化head=1,tail=10;
6 3 1 7 5 8 9 2 4
head tail
q[] 1 2 3 4 5 6 7 8 9 10 11
6 3 1 7 5 8 9 2 4 3
head tail
q[] 1 2 3 4 5 6 7 8 9 10 11 12
6 3 1 7 5 8 9 2 4 3 7
以此类推,数组最终为
q[] 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
6 3 1 7 5 8 9 2 4 3 7 8 2 3 8 3 3
代码实现:
#include
using namespace std;
int main()
{
int q[200],head,tail,i,n;
while(cin>>n)
{
for(i=1;i<=n;i++)
cin>>q[i];
head=1;tail=n+1;
while(head
(二)栈
栈与队列的区别就是队列为先进先出的数据结构,栈为先进后出的数据结构。好比一个桶里有3个球从下往上依次是2 1 3,现在想将4放入最底下,只能先将3取出然后是1,然后是2。可见最先放进去的被最后拿出,这即是栈的特点。(国二考试的考点~~)
栈究竟有哪些作用?最主要的就是判断字符串是否为回文字符串。所谓回文字符串指正着读反着读都一样的字符串,如“abcba”,“席主席”等。栈的实现很简单,只需定义一个一维数组或者字符串和一个指向栈顶的变量top即可。
例:给出一个字符串,判断是否是回文字符串。
分析:若字符串回文则它比关于中间对称。第一步读入字符串并求出其中点。
char a[200];
int mid,len;
gets(a);
len=strlen(a);
mid=len/2-1;
接下来便该栈出场了。
先将mid之前的字符读入栈,定义用来实现栈的数组char s[200],初始化将top=0。入栈操作即是:
char s[200];
for(int i=0;i
s[top++]=a[i];
关键步骤!!!
当前字符依次出栈,看是否与mid之后的字符相同,相同则为回文,反之不为。
注意:对比前先判断字符串长度是奇数还是偶数,若为偶数,从mid+1位开始对比,反之从mid+2位开始对比。
if(len%2==0) mid+=1;
if(len%2==1) mid+=2;
for(int i=mid+1;i<=len-1;i++)
if(a[i]!=s[top--]) break;
if(top==0) cout<<"YES"<
else cout<<"NO"<
完整代码:
#include
#include
#include
using namespace std;
int main()
{
char a[200],s[200];
int mid,top,len;
while(cin>>a)
{
len=strlen(a);
mid=len/2-1;
top=0;
for(int i=0;i<=mid;i++)
{
s[++top]=a[i];
}
if(len%2==0) mid+=1;
if(len%2==1) mid+=2;
for(int i=mid;i<=len-1;i++)
{
if(a[i]!=s[top--]) break;
}
if(top==0) cout<<"YES"<
Input: ahaha
ahah
Output:YES
NO