栈队列链表算法总结

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说明栈为空

复制代码
//栈的用法实例
#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  } 
复制代码

输入情况:

1
2
5
1 2 3 4 5  

输出情况:

1
2
3
输出栈内现存元素:
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      } 
复制代码

例题:

 

posted @   saaas  阅读(331)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示