基础篇——队列,栈
2015-09-15 10:29
232 查看
队列与栈
(一)队列
经典例题:一串长为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
代码实现:
(二)栈
栈与队列的区别就是队列为先进先出的数据结构,栈为先进后出的数据结构。好比一个桶里有3个球从下往上依次是2 1 3,现在想将4放入最底下,只能先将3取出然后是1,然后是2。可见最先放进去的被最后拿出,这即是栈的特点。(国二考试的考点~~)
栈究竟有哪些作用?最主要的就是判断字符串是否为回文字符串。所谓回文字符串指正着读反着读都一样的字符串,如“abcba”,“席主席”等。栈的实现很简单,只需定义一个一维数组或者字符串和一个指向栈顶的变量top即可。
例:给出一个字符串,判断是否是回文字符串。
分析:若字符串回文则它比关于中间对称。第一步读入字符串并求出其中点。
接下来便该栈出场了。
先将mid之前的字符读入栈,定义用来实现栈的数组char s[200],初始化将top=0。入栈操作即是:
关键步骤!!!
当前字符依次出栈,看是否与mid之后的字符相同,相同则为回文,反之不为。
注意:对比前先判断字符串长度是奇数还是偶数,若为偶数,从mid+1位开始对比,反之从mid+2位开始对比。
完整代码:
ahah
Output:YES
NO
(一)队列
经典例题:一串长为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<iostream> 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<tail) { cout<<q[head++]; q[tail++]=q[head++]; } cout<<endl; } return 0; }
(二)栈
栈与队列的区别就是队列为先进先出的数据结构,栈为先进后出的数据结构。好比一个桶里有3个球从下往上依次是2 1 3,现在想将4放入最底下,只能先将3取出然后是1,然后是2。可见最先放进去的被最后拿出,这即是栈的特点。(国二考试的考点~~)
栈究竟有哪些作用?最主要的就是判断字符串是否为回文字符串。所谓回文字符串指正着读反着读都一样的字符串,如“abcba”,“席主席”等。栈的实现很简单,只需定义一个一维数组或者字符串和一个指向栈顶的变量top即可。
例:给出一个字符串,判断是否是回文字符串。
分析:若字符串回文则它比关于中间对称。第一步读入字符串并求出其中点。
<pre name="code" class="cpp">char a[200];
int mid,len;
gets(a);
len=strlen(a);
mid=len/2-1;
接下来便该栈出场了。
先将mid之前的字符读入栈,定义用来实现栈的数组char s[200],初始化将top=0。入栈操作即是:
<pre name="code" class="cpp">char s[200];
for(int i=0;i<mid;i++)
s[top++]=a[i];
关键步骤!!!
当前字符依次出栈,看是否与mid之后的字符相同,相同则为回文,反之不为。
注意:对比前先判断字符串长度是奇数还是偶数,若为偶数,从mid+1位开始对比,反之从mid+2位开始对比。
<pre name="code" class="cpp">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"<<endl;
else cout<<"NO"<<endl;
完整代码:
#include<iostream> #include<stdio.h> #include<string.h> 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"<<endl; else cout<<"NO"<<endl; } return 0; }Input: ahaha
ahah
Output:YES
NO
相关文章推荐
- PHP---ajax传递POST值(包含html标记)到提交页面数据丢失或乱码
- C++动态特性和C++对象模型——《高质量程序设计12章》
- angularJs的动画效果实现
- 蒋鑫:为什么 Git 比 SVN 好
- 洛谷1373 小a和uim之大逃离(dp)
- 用java PreparedStatement就不用担心sql注入了吗?
- 按照某一字段的相同值合并所对应的行的值
- django bug 与陷阱
- 26.Remove Duplicates from Sorted Array(Array)
- MySQL5.6 replication architecture --原图来自姜承尧
- C++ typedef typename
- cobbler自动化部署多种类型的操作系统,一个软件全部搞定
- cobbler自动化部署多种类型的操作系统,一个软件全部搞定
- 性能调优工具Jstack使用
- Xamarin.Android使用教程之Android开发所需的模拟器
- Sqlite3 使用入门
- Linux 查看系统硬件信息(实例详解)
- OC的内存管理
- 04_解决字段名与实体类属性名不相同的冲突
- MAC 命令行 查看硬盘和文件夹大小(占用空间)