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\n",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("栈未初始化,请初始化以后再使用\n"); 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("入栈成功!\n"); 53 } 54 //出栈 55 int Pop(Stack stack) 56 { 57 //判断栈是否为空 58 if(!stack->next) 59 { 60 printf("栈为空,无法出栈\n"); 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\n",Pop(stack)); 83 printf("%d\n",Pop(stack)); 84 printf("%d\n",Pop(stack)); 85 printf("%d\n",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>