• stack and queue


    使用标准库的栈和队列时,先包含相关的头文件

    #include

    #include

    定义栈如下:

    stack stk;

    定义队列如下:

    queue q;

    栈提供了如下的操作

    1
    2
    3
    4
    5
    s.empty()               如果栈为空返回true,否则返回false
    s.size()                返回栈中元素的个数
    s.pop()                 删除栈顶元素但不返回其值
    s.top()                 返回栈顶的元素,但不删除该元素
    s.push()                在栈顶压入新元素

    队列提供了下面的操作

    1
    2
    3
    4
    5
    6
    q.empty()               如果队列为空返回true,否则返回false
    q.size()                返回队列中元素的个数
    q.pop()                 删除队列首元素但不返回其值
    q.front()               返回队首元素的值,但不删除该元素
    q.push()                在队尾压入新元素
    q.back()                返回队列尾元素的值,但不删除该元素

    c++stack(堆栈)

    它是一个容器的改编,它实现了一个先进后出的数据结构(FILO)

    使用该容器时需要包含#include头文件;

    定义stack对象的示例代码如下:

    stacks1;

    stacks2;

    stack的基本操作有:

    1.入栈:如s.push(x);

    2.出栈:如 s.pop().注意:出栈操作只是删除栈顶的元素,并不返回该元素。

    3.访问栈顶:如s.top();

    4.判断栈空:如s.empty().当栈空时返回true。

    5.访问栈中的元素个数,如s.size();

    下面举一个简单的例子:

      1   #include<iostream>  
      2     #include<stack>  
      3     using namespace std;  
      4     int main(void)  
      5     {  
      6         stack<double>s;//定义一个栈  
      7         for(int i=0;i<10;i++)  
      8             s.push(i);  
      9         while(!s.empty())  
     10         {  
     11             printf("%lf
    ",s.top());  
     12             s.pop();  
     13         }  
     14         cout<<"栈内的元素的个数为:"<<s.size()<<endl; pre="" return=""><h3>栈的定义:</h3>
     15 栈是限定仅在表尾进行插入或删除操作的线性表,因此表尾端成为栈顶,相应的,表头端成为栈底,不含有任何元素的栈称为空栈。
     16 栈的修改遵循后进先出的原则,因此栈又称为后进先出的线性表,简称LIFO结构。
     17 栈一般采用数组作为其存储结构,这样做可以避免使用指针,简化程序,当然数组需要预先声明静态数据区的大小,但这不是问题,因为即便是频繁进出入栈操作,任何时刻栈元素的实际个数也不会很多,为栈预留一个足够大但又不占用太多空间并不是很困难,如果不能做到这一点,那么节省内存的方法就是使用链表存储栈。
     18  
     19 线性表实现栈的基本操作<pre class="brush:java;">    #include<iostream>  
     20     #include<cstdio>  
     21     using namespace std;  
     22     typedef struct Stacknode//定义链式栈的结构体  
     23     {  
     24         int data;//数据域  
     25         Stacknode *next;//下一节点的指针域  
     26     }Stacknode,*Stack;  
     27     //初始化一个链式栈(返回一个链式栈的头节点)  
     28     Stack InitStack()  
     29     {  
     30         Stack stack=(Stack)malloc(sizeof(Stacknode));  
     31         stack->next=NULL;  
     32         return stack;  
     33     }  
     34     //入栈  
     35     void Push(Stack stack,int newData)  
     36     {  
     37         //判断是否为空  
     38         if(stack==NULL)  
     39         {  
     40             printf("栈未初始化,请初始化以后再使用
    ");  
     41             return;  
     42         }  
     43         //找到最后一个节点  
     44        Stacknode *lastnode=stack;  
     45        while(lastnode->next)  
     46         {  
     47         lastnode=lastnode->next;  
     48         }  
     49        lastnode->next=(Stacknode*)malloc(sizeof(Stacknode*));  
     50        lastnode->next->data=newData;  
     51        lastnode->next->next=NULL;  
     52        printf("入栈成功!
    ");  
     53     }  
     54     //出栈  
     55     int Pop(Stack stack)  
     56     {  
     57         //判断栈是否为空  
     58         if(!stack->next)  
     59         {  
     60             printf("栈为空,无法出栈
    ");  
     61             return -1;//-1只是一个自定义的错误代码  
     62         }  
     63         //找到最后一个节点的钱一个节点  
     64         //tempNode:最后一个节点的前一个节点  
     65         Stacknode *tempNode=stack;  
     66         while(tempNode->next->next)  
     67         {  
     68             tempNode=tempNode->next;  
     69         }  
     70         int data=tempNode->next->data;  
     71         free(tempNode->next);  
     72         tempNode->next=NULL;  
     73         return data;  
     74     }  
     75        
     76     int main()  
     77     {  
     78         Stack stack=InitStack();  
     79         Push(stack,3);//3进栈  
     80         Push(stack,4);//4进栈  
     81         Push(stack,5);//5进栈  
     82         printf("%d
    ",Pop(stack));  
     83         printf("%d
    ",Pop(stack));  
     84         printf("%d
    ",Pop(stack));  
     85         printf("%d
    ",Pop(stack));//第4次出栈,应该出错  
     86         return 0;  
     87     }  </cstdio></iostream></pre>
     88 <h2> </h2>
     89 <p><strong>C++ Queue(队列)</strong></p>
     90 <p> </p>
     91 <p>queue模版类的定义在<queue>头文件中。</queue></p>
     92 <p>queue与stack模版非常类似,queue模版也需要定义两个模版参数,一个是元素类型,一个是容器类型,元素类型是必要的,容器类型是可选的,默认为dqueue类型。</p>
     93 <p>定义queue对象的示例代码如下:</p>
     94 <p>queue<int>q1;</int></p>
     95 <p>queue<double>q2;</double></p>
     96 <p>queue的基本操作有:</p>
     97 <p>1.入队:如q.push(x):将x元素接到队列的末端;</p>
     98 <p>2.出队:如q.pop() 弹出队列的第一个元素,并不会返回元素的值;</p>
     99 <p>3,访问队首元素:如q.front()</p>
    100 <p>4,访问队尾元素,如q.back();</p>
    101 <p>5,访问队中的元素个数,如q.size();</p>
    102 <p>二.优先队列</p>
    103 <p>在<queue>头文件中,还定义了一个非常有用的模版类priority_queue(优先队列),优先队列与队列的差别在于优先队列不是按照入队的顺序出队,而是按照队列中元素的优先权顺序出队(默认为大者优先,也可以通过指定算子来指定自己的优先顺序)默认是一个大根堆。</queue></p>
    104 <p>priority_queue模版类有三个模版参数,元素类型,容器类型,比较算子。其中后两个都可以省略,默认容器为vector,默认算子为less,即小的往前排,大的往后排(出队时序列尾的元素出队)。</p>
    105 <p>定义priority_queue对象的示例代码如下:</p>
    106 <p>priority_queue<int>q1;</int></p>
    107 <p>priority_queue<pair<int,int> >q2;</pair<int,int></p>
    108 <p>priority_queue<int,vector<int>,greater<int> >q3;//定义小的先出队</int></int,vector<int></p>
    109 <p>priority_queue的基本操作均与queue相同</p>
    110 <p>初学者在使用priority_queue时,最困难的可能就是如何定义比较算子了。如果是基本数据类型,或已定义了比较运算符的类,可以直接用STL的less算子和greater算子——默认为使用less算子,即小的往前排,大的先出队。如果要定义自己的比较算子,方法有多种,这里介绍其中的一种:重载比较运算符。优先队列试图将两个元素x和y代入比较运算符(对less算子,调用x<y,对greater算子,调用x>y),若结果为真,则x排在y前面,y将先于x出队,反之,则将y排在x前面,x将先出队。</y,对greater算子,调用x></p>
    111 <p>看下面这个简单的示例:</p>
    112 <pre class="brush:java;">    #include<iostream>  
    113     #include<queue>  
    114     #include<stdlib.h>  
    115     using namespace std;  
    116     class T  
    117     {  
    118     public:  
    119         int x,y,z;  
    120         T(int a,int b,int c):x(a),y(b),z(c)  
    121         {  
    122         }  
    123     };  
    124     bool operator<(const T&t1,const T&t2)  
    125     {  
    126         return t1.z<t2.z; int="" t="">q;  
    127         q.push(T(4,4,3));  
    128         q.push(T(2,2,5));  
    129         q.push(T(1,5,4));  
    130         q.push(T(3,3,6));  
    131         while(!q.empty())  
    132         {  
    133             T t=q.top();  
    134             q.pop();  
    135             cout<<t.x<<" alt="" bool="" const="" img="" pre="" return="" src="http://www.2cto.com/uploadfile/Collfiles/20150330/20150330084746391.png" t=""></t.x<<"></t2.z;></stdlib.h></queue></iostream></pre>
    136 </s.size()<<endl;></double></stack></iostream>
  • 相关阅读:
    技成客户端 更新日志
    丝路英雄单人辅助更新记录
    前端移动库方案知识整理
    外挂程序开发过程中的一些思路.
    MySQL server has gone away
    杂七乱八
    无损压缩图片心得(二)
    无损压缩图片心得
    前端测试自动化工具(一)
    HTML5 拖放及排序的简单实现
  • 原文地址:https://www.cnblogs.com/topW2W/p/5148917.html
Copyright © 2020-2023  润新知