栈和队列

栈> 栈(stack)又名堆栈,它是一种特殊的线性表。元素之间成线性结构。在c++中其头文件为<stack>

特性:运算受限制,只允许在栈顶进行插入删除操作,插入叫做进栈,入栈或者压栈(push),删除叫做出栈(pop),由于有这种特性,所以著名特点是后进先出。

定义:stack<type>s

现在展示一道题进行讲解吧,话不多说请看题,杭电acm题

 

根据题目要求,我们很清楚的知道,这就是一个关于栈的应用,当一辆辆列车进去之后,只能当后面的列车出来了,最前面的车才可以出来。正好符合栈的特性,因此,我们可以定义一个栈来模拟这个过程

完整代码如下:

 

 
  1. #include<stdlib.h>

  2. #include<iostream>

  3. #include<stack>

  4. using namespace std;

  5. int main()

  6. {

  7. char in[100]; char out[100]; int flag[200];

  8. int n;

  9. while (cin >> n) {

  10. int i, j; i = j = 0;

  11. cin >> in;

  12. cin >> out;

  13. stack<char>s;//定义为字符型的栈结构

  14. for ( i = 0; i <=n;)

  15. {

  16. if (s.empty())//判断栈为空,push第一个元素

  17. {

  18. s.push(in[i]);

  19. flag[i + j] = 0;

  20. i++;

  21. }

  22. if (!s.empty()&&s.top()!=out[j])//当栈不空且栈顶不为当前出栈的元素时继续输入

  23. {

  24. s.push(in[i]);

  25. flag[i + j] = 0;

  26. i++;

  27. }

  28. if (!s.empty()&&s.top() == out[j])//栈不空且和当前出栈元素相等时进行pop

  29. {

  30. s.pop();

  31. flag[i + j] = 1;

  32. j++;

  33. }

  34. }

  35. if (s.empty())

  36. {

  37. cout << "Yes." << endl;

  38. for (i = 0; i < 2*n; i++)

  39. {

  40. if (flag[i] ==0)//利用flag来进行判断时输入还是输出

  41. cout << "in"<<endl;

  42. else cout << "out" << endl;

  43. }

  44. cout << "FINSH" << endl;

  45. }

  46. else//当不满足上面的条件时输出NO

  47. cout << "NO." << endl<<"FINSH"<<endl;

  48. }

  49. }


接下来说一下队列

 

<队列> 队列(queue)是一种特殊的线性表。在c++中头文件为<queue>

特性:它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。著名特点和栈相反,是先进先出。

定义:queue<int>q,queue<string>q,queue<node>q,

操作:插入q.push(),删除q.pop(),注意,q.pop()并不会返回元素值,而要用q.front()返回队头元素,用q.back()返回队尾元素

 

详细用法:
查看是否为空范例        M.empty()    是的话返回1,不是返回0;
从已有元素后面增加元素   M.push()
输出现有元素的个数      M.size()
显示第一个元素          M.front()
显示最后一个元素        M.back()
清除第一个元素          M.pop()
*/
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
queue <int> myQ;

cout<< "现在 queue 是否 empty? "<< myQ.empty() << endl; 

for(int i =0; i<10 ; i++)
{
myQ.push(i);
}
for(int i=0; i<myQ.size(); i++)
{
printf("myQ.size():%d\n",myQ.size());
cout << myQ.front()<<endl;
myQ.pop();
}

system("PAUSE"); 

return 0;
}

输出结果:
现在 queue 是否 empty? 1
myQ.size():10
0
myQ.size():9
1
myQ.size():8
2
myQ.size():7
3
myQ.size():6
4
请按任意键继续. . .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值