【问题标题】:swapping the first and last element in a stack using c++使用c ++交换堆栈中的第一个和最后一个元素
【发布时间】:2016-07-11 08:28:27
【问题描述】:

我想创建一个函数来获取堆栈(作为数组) 并让它返回堆栈,将堆栈中的第一个元素与最后一个元素交换 所以我将使用临时堆栈来存储数据 我会用 但是我怎么知道我什么时候会到达堆栈的末尾?

我已经将堆栈的实现写成一个数组 但我需要函数交换方面的帮助

void Swap(Stack x)
{
Stack tmp(100);
int top1 = x.pop;

for (int i = 0;; i++)
{
x.pop = tmp.push;
}

}

我知道它错了,但我不确定 任何帮助,将不胜感激 ,谢谢 编辑 我一开始是这样写函数的,发现不能带参数

void stack::Swap()
{
Stack tmp(100);
int top1 =  this->pop;

for (int i = 0;; i++)
{
this->pop = tmp.push
}

};

此处编辑是来自答案的代码

Stack Swap(Stack x){

int mytop,mybottom;

mytop=x.pop();

int tmp[x.length-2],i=0;

while(!x.isEmpty()){

    mybottom=x.pop();

    tmp[i++]=mybottom;


    }

Stack returnIt;

returnIt.push(mytop);

for(i=0;i<=x.length -3;i++){

    returnIt.push(tmp[i]);

    }

returnIt.push(mybottom);

return returnIt;

}

【问题讨论】:

    标签: arrays stack swap


    【解决方案1】:

    IDEA :将堆栈的顶部和底部存储在变量中,并将顶部和底部之间的元素存储在数组中。现在您只需将原始堆栈的底部推入新堆栈,然后按原始顺序将元素推入新堆栈,然后最终推入原始堆栈的顶部。

    code.

    #include <bits/stdc++.h>
    using namespace std;
    void rev(stack<int>&x){
        int sz=x.size(),mytop,mybottom;
        mytop=x.top();
        x.pop();
        int tmp[sz-1],i=0;
        while(!x.empty()){
            mybottom=x.top();
            tmp[i++]=mybottom;
            x.pop();
            } 
        stack<int> returnIt;
        returnIt.push(mybottom);
        for(i=0;i<=sz-3;i++){
            returnIt.push(tmp[i]);
            }
        returnIt.push(mytop);
        while(!returnIt.empty()){
            int tt=returnIt.top();
            x.push(tt);
            returnIt.pop();
        }
        }
    int main() {
        // your code goes here
        stack<int>x;
        x.push(1);
        x.push(2);
        x.push(3);
        x.push(4);
        x.push(5);
        stack<int>y=x;
        cout<<"Before reversing : ";
        while(!y.empty()){
            int tt=y.top();
            cout<<tt;
            y.pop();
        }
    
        rev(x);
        cout<<"\nAfter reversing : ";
        while(!x.empty()){
            cout<<x.top();
            x.pop();
        }
        return 0;
    }
    

    【讨论】:

    • 我明白你做了什么,但函数应该是一个 void 所以如果堆栈是 1 2 3 4 5 它应该变成 5 2 3 4 1 等函数应该执行以下操作(大小)它在我写的代码中称为长度,它是一个私有参数,所以我将它更改为公共,长度是用户输入的变量
    • 哎呀,我从 void 函数返回了“堆栈”(那是错误的),但无论如何您可以将堆栈作为参考传递,然后最后将“returnIt”的内容复制到原始堆栈,即。 'x'
    • 是的,我这样做了,但问题是整个堆栈是反向的
    • 成功了!谢谢我明白了,但诀窍是让堆栈的主要实现在这里是我的完整代码你能帮我找到问题吗? ideone.com/4aQRKO(链接)
    • 你去吧.. link @AymanIBreak 在本地机器上运行它,或者如果你使用'ideone',别忘了提供输入..
    【解决方案2】:

    我不知道我是否真的正确理解了您的问题,但看起来您希望堆栈的第一个元素成为最后一个元素,而最后一个元素成为第一个元素。如果是这样,您还没有真正了解堆栈的工作方式以及何时使用它,因为堆栈就像现实生活中的堆栈。例如,你在一个经典的圆筒中放一堆 Pringles(是的薯片)。现在堆栈只允许您访问堆栈顶部的元素(添加的最后一个对象),这是因为如果您尝试取出其中一个中心,堆栈将会崩溃。但是如果你想在中心获取一个元素,你必须从顶部获取这么多元素,直到你到达那个元素,但是如果你这样做,你使用的堆栈是错误的!堆栈是按添加的顺序收集对象(如列表),但只能访问顶部。例如,您可以将其用于编辑器中的撤消功能,在那里您将执行的所有操作添加到堆栈中。现在,如果您使用撤消功能,可以撤消下一个操作之后的一个操作,但是如果您现在执行不同的操作,则堆栈顶部会出现一个新元素,而您已采取的这些元素不能再次放置在该元素上,因此它们只是坏了(如果你愿意,你可以吃它们)(就像一个时间悖论:“你不能撤消你没有做过的事情,你不能重做你永远不会做的事情”)。

    我希望我能帮助你理解堆栈的基本工作,但如果你有任何其他问题或我错过了理解你的问题,请纠正我。

    但是如果你真的想做,你正在尝试什么,你必须考虑,你如何在现实生活中做这样的事情:你必须一个接一个地从堆栈中取出每个元素,然后构建一个新堆栈在中间具有相同的顺序,但您放入堆栈的第一个索引是旧堆栈中的第一个。

    我从来没有真正用 C++ 编程过,但在伪代码中它可能看起来像这样:

    Stack stack;
    List<StackElement> list;
    //Converting stack to list for better access
    for(int i = 0; i<stack.size;i++)
    {
        list.add(stack.top);
        stack.pop;
    }
    //Add the last element from the list (the last from the stack) on top of the stack (thats now the only object in the stack)
    stack.push(list.get(list.size()-1));
    list.remove(list.size()-1); //Remove this element
    //Save our last element
    StackElement lastElement = list.get(0);
    list.remove(0);
    //Inserting the mid
    for(int i = 0; i<list.size;i++)
    {
        stack.push(list.get(i));
    }
    //Now put the last element from the old stack on top of the new
    stack.push(lastElement):
    

    我很抱歉我的英语不好,我希望你能理解我想说的基本内容。而且代码只是理论,可能是错误的!

    【讨论】:

    • 我了解堆栈,这就是我所要求的,如果我想使用一个函数将堆栈从 1 2 3 4 5 更改为 5 2 3 4 1,我应该将所有堆栈弹出到到达最后一个元素,我希望它是一个 void 不返回修改后的堆栈
    • 退货有什么问题?而且你不必这样做,你也可以直接用堆栈做伪代码所说的......
    • 这个问题是作为一个堆栈来解决的,以使用另一个堆栈我猜的主要思想 1 存储顶部元素 2-将原始堆栈的中间放入另一个堆栈 3-存储最后一个元素 4 将第一个元素返回到堆栈 5- 返回中间然后将最后一个元素返回到顶部,但我在编写函数时需要帮助
    • 对不起,我还是不明白。您想使用多个堆栈吗?要不然是啥?如果你愿意,我可以将我的伪代码重写为真正的函数,这不是问题。
    • 很抱歉,但我不确定伪代码是什么 :( 我现在只使用 c++,不,我只想要一个将堆栈作为参数并修改堆栈的函数(交换第一个和最后一个元素)就像编辑的代码
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多