如何从stack中删除一个无素?

时间:2022-10-27 22:13:30
下面这个程序是从一个stack中删除一个元素,我是借用另一个stack才达到目的,我想知道能不能不用借助另一个stack达到目的,请大家教给我另一种方法吧。这个程序是我想把4从stack中删除。
#include <iostream>
#include <stack>
using namespace std;

int main()
{
    stack<int>a;
    a.push(10);
    a.push(6);
    a.push(4);
    a.push(20);
    a.push(15);

    stack<int>b;

    for(int i=a.size()-1; i>=0; i--)
    {
        int count = a.top();
        a.pop();
        if(count != 4)
        {
            b.push(count);
        }
    }

    while(!b.empty())
    {
        cout<<b.top()<<" ";
        b.pop();
    }

    return 0;
}

12 个解决方案

#1


说下思路,先把数据全部抛出来,删除某个,再重新压进去

#2


栈本就是先进先出的数据结构,你想删除中间的某个值,那就必须把栈顶部的值都放出去存储起来,然后再入栈存进来。
如果不借用stack,那就借用vector,入栈的时候用反向迭代器访问vector。
不过还不如用stack。

#3


无语!这你还用stack干什么?你的选择可能有问题?你不该用stack。如果非要这么用,自己重载一个。

#4


我记得好像可以用stack 去初始化一个vector 反正都是容器,你从vector删除stack就可以了,但是貌似,你用stack构造vector,然后用vector构造stack,会两次构造函数,这样会导致略慢

#5


#include <iostream>
#include <stack>
using namespace std;
template <class T>
class mystack :public  stack<T>
{
public:
    void mypop(T num)
    {
        this->c.erase(c.begin()+1);
    }
};
int main()
{
    mystack<int> sta;
    sta.push(1);
    sta.push(2);
    sta.mypop(1);
    int b = sta.top();
    cout << "b = " <<b<< endl;
    return 0;
}

代码有点丑陋  意思说明白了。
stack内部实现是STL容器(list或者其他),是保护成员。
继承stack,通过子类的成员函数操作stack内部容器就行。

#6


如果有从中间删除元素的需求,那就不应该选择stack。

#7


原理上讲只能这样做

#8


我这个程序是练习stack的,所以没用vector.

#9


引用 1 楼 max_min_ 的回复:
说下思路,先把数据全部抛出来,删除某个,再重新压进去

按照这个提示,我试着写了一下,但是感觉自己写得好复杂。

#include <iostream>
#include <stack>
using namespace std;

int main()
{
    stack<int>a;
    a.push(10);
    a.push(6);
    a.push(4);
    a.push(20);
    a.push(15);

    stack<int>b;

   int count[a.size()-1];
   int n = 0;
   int num;
    for(int i=a.size()-1; i>=0; i--)
    {

       num  = a.top();
       if(num != 4)
       {
            count[n] = num;
            n++;
       }
       a.pop();

    }
    for(int i=0; i<n; i++)
    {
        a.push(count[i]);
    }
    while(!(a.empty()))
    {
        cout<<a.top()<<" ";
        a.pop();
    }

 
    return 0;
}

#10


栈的作用就是先进先出,你既然不想先进先出,你就不应该用栈。
就像选择大米是用来做饭一样,既然你想吃面条就不应该选择大米。现在你选择了大米,却来问用大米怎么做面条,你不觉得很可笑吗?折腾死你也只能做出个米粉,永远吃不成面条。

#11


怎么好几个都说栈先进先出。。。那是队列好吗。。。 如何从stack中删除一个无素?

#12


引用 10 楼 lovesmiles 的回复:
栈的作用就是先进先出,你既然不想先进先出,你就不应该用栈。
就像选择大米是用来做饭一样,既然你想吃面条就不应该选择大米。现在你选择了大米,却来问用大米怎么做面条,你不觉得很可笑吗?折腾死你也只能做出个米粉,永远吃不成面条。


你说得有些道理,但是我是因为在练习阶段,是想知道除了这个思路以外,有没有别的思路。从大家的发言来看,我的思路好像是好的。

#1


说下思路,先把数据全部抛出来,删除某个,再重新压进去

#2


栈本就是先进先出的数据结构,你想删除中间的某个值,那就必须把栈顶部的值都放出去存储起来,然后再入栈存进来。
如果不借用stack,那就借用vector,入栈的时候用反向迭代器访问vector。
不过还不如用stack。

#3


无语!这你还用stack干什么?你的选择可能有问题?你不该用stack。如果非要这么用,自己重载一个。

#4


我记得好像可以用stack 去初始化一个vector 反正都是容器,你从vector删除stack就可以了,但是貌似,你用stack构造vector,然后用vector构造stack,会两次构造函数,这样会导致略慢

#5


#include <iostream>
#include <stack>
using namespace std;
template <class T>
class mystack :public  stack<T>
{
public:
    void mypop(T num)
    {
        this->c.erase(c.begin()+1);
    }
};
int main()
{
    mystack<int> sta;
    sta.push(1);
    sta.push(2);
    sta.mypop(1);
    int b = sta.top();
    cout << "b = " <<b<< endl;
    return 0;
}

代码有点丑陋  意思说明白了。
stack内部实现是STL容器(list或者其他),是保护成员。
继承stack,通过子类的成员函数操作stack内部容器就行。

#6


如果有从中间删除元素的需求,那就不应该选择stack。

#7


原理上讲只能这样做

#8


我这个程序是练习stack的,所以没用vector.

#9


引用 1 楼 max_min_ 的回复:
说下思路,先把数据全部抛出来,删除某个,再重新压进去

按照这个提示,我试着写了一下,但是感觉自己写得好复杂。

#include <iostream>
#include <stack>
using namespace std;

int main()
{
    stack<int>a;
    a.push(10);
    a.push(6);
    a.push(4);
    a.push(20);
    a.push(15);

    stack<int>b;

   int count[a.size()-1];
   int n = 0;
   int num;
    for(int i=a.size()-1; i>=0; i--)
    {

       num  = a.top();
       if(num != 4)
       {
            count[n] = num;
            n++;
       }
       a.pop();

    }
    for(int i=0; i<n; i++)
    {
        a.push(count[i]);
    }
    while(!(a.empty()))
    {
        cout<<a.top()<<" ";
        a.pop();
    }

 
    return 0;
}

#10


栈的作用就是先进先出,你既然不想先进先出,你就不应该用栈。
就像选择大米是用来做饭一样,既然你想吃面条就不应该选择大米。现在你选择了大米,却来问用大米怎么做面条,你不觉得很可笑吗?折腾死你也只能做出个米粉,永远吃不成面条。

#11


怎么好几个都说栈先进先出。。。那是队列好吗。。。 如何从stack中删除一个无素?

#12


引用 10 楼 lovesmiles 的回复:
栈的作用就是先进先出,你既然不想先进先出,你就不应该用栈。
就像选择大米是用来做饭一样,既然你想吃面条就不应该选择大米。现在你选择了大米,却来问用大米怎么做面条,你不觉得很可笑吗?折腾死你也只能做出个米粉,永远吃不成面条。


你说得有些道理,但是我是因为在练习阶段,是想知道除了这个思路以外,有没有别的思路。从大家的发言来看,我的思路好像是好的。