1.队列
struct queue{
int head;
int tail;
int a[1001];
};
2.栈
栈的基本操作:
定义栈:stack<int> S;
入栈(定义栈元素):S.push(i);
出栈(删除栈元素):S.pop();
返回栈顶元素的值:S.top();
判断栈是否为空:S.empty(); //值为0说明不空 值为1说明栈为空
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
//栈的用法实例 #include<iostream> #include<stack> using namespace std; int main() { stack<int> S;//声明栈S int n,m; cin>>n;//入栈的元素个数 //入栈 也就是给栈中的元素赋值 for(int i=0;i<n;i++) { cin>>m; S.push(m); //入栈 } //出栈 假设元素为偶数则出栈 while(!S.empty()) //当栈不为空时 { int t=S.top(); if(t%2==0) //栈顶元素为偶数则输出 { cout<<"出栈:"<<S.top()<<endl; } S.pop(); //出栈 } cout<<"此时栈里面元素个数为:"<<S.size()<<endl; }
需注意的问题:
我之前想要处理一堆数,遇到偶数就出栈输出,输出栈内部剩余的数
于是我这样做了(有问题代码):
1 //栈的用法实例 2 #include<iostream> 3 #include<stack> 4 using namespace std; 5 int main() 6 { 7 stack<int> S;//声明栈S 8 int n,m; 9 cin>>n;//入栈的元素个数 10 //入栈 也就是给栈中的元素赋值 11 for(int i=0;i<n;i++) 12 { 13 cin>>m; 14 S.push(m); 15 } 16 //出栈 假设元素为偶数则出栈 17 for(int i=0;i<n;i++) //循环n个元素 18 { 19 int t=S.top(); 20 if(t%2==0) //栈顶元素 注意:如果元素不为偶数,下面的都不会判断,因为它top指针不会往下面走 21 { 22 cout<<"出栈:"<<S.top()<<endl; 23 S.pop(); //出栈 24 } 25 } 26 cout<<"输出栈内现存元素:"<<endl; 27 //输出栈内现存元素 28 while(S.empty()==0) 29 { 30 cout<<S.top()<<" "; 31 S.pop(); 32 } 33 cout<<endl; 34 cout<<"此时栈里面元素个数为:"<<S.size()<<endl; 35 }
输入情况:
5
1 2 3 4 5
输出情况:
输出栈内现存元素:
5 4 3 2 1
此时栈里面元素个数为:0
我们可以发现一个问题:
它偶数2与4是没有出栈的(未被删除掉),为什么呢???
原因在于:上面5个元素入栈以后,栈顶元素此时为5,t%2!=0,所以不进行if(t%2==0)里面的操作,那么S.pop()就不会进行,top指针就一直不变(尽管for语句一直执行),t一直都等于5,所以也不会进行偶数出栈
解决方法:
如果要删除偶数,而输出奇数时,可以直接在判断偶数时就输出,S.pop()一直需要执行,top指针才会往下。
1 for(int i=0;i<n;i++) //循环n个元素 2 { 3 int t=S.top(); 4 if(t%2==0) //栈顶元素 注意:如果元素不为偶数,下面的都不会判断,因为它top指针不会往下面走 5 { 6 cout<<"出栈:"<<S.top()<<endl; 7 } 8 else 9 cout<<"奇数:"<<S.top()<<endl; 10 S.pop(); //出栈 11 }
例题: