簡體   English   中英

遞歸反轉堆棧

[英]Recursively reverse a stack

我需要在 C++ 中使用遞歸來反轉堆棧。 我只能使用poppushreverseStack沒有其他功能,例如我在搜索 stackoverflow 和 web 時發現的insertAtBottom

我試過了:

void Stack::reverseStack(){
    if (isEmpty())
        return;
    else{
        int x;
        pop(x);
        reverseStack();
        push(x);
    }
}

但這會創建一個與原始堆棧完全相同的堆棧。

您將需要實現一個函數在底部插入一個項目,一個例子是

void Stack::insertAtBottom(int item) {
    if(isEmpty())
        push(item);
    else {
        int x;
        pop(x);
        insertAtBottom(item);
        push(x);
    }
}

此時,您可以按如下方式實現反向

void Stack::reverseStack(){
    if (isEmpty())
        return;
    else{
        int x;
        pop(x);
        reverseStack();
        insertAtBottom(x);
    }
}

編輯:如果他們需要在一個功能中,以下是兩者的組合

void Stack::reverseStack(bool reverse=true,int item=0){
    if(reverse) {
        if (isEmpty())
            return;
        else{
            int x;
            pop(x);
            reverseStack();
            reverseStack(false,x);
        }
    } else {
        if(isEmpty())
            push(item);
        else {
            int x;
            pop(x);
            reverseStack(false,item);
            push(x);
        }
    }
}

干杯!

#include <iostream>
#include <stack>

using namespace std;

stack<int> S, R; // S is original stack, R is reversed stack

void reverseStack() {
    if(!S.empty()) {
        R.push(S.top());
        S.pop();
        reverseStack();
    }
    return;
}

int main() {
    S.push(1);
    S.push(2);
    S.push(3);
    S.push(4);
    S.push(5);

    reverseStack();

    // Check if R is reversed
    while(!R.empty()) {
        cout << R.top() << " ";
        R.pop();
    }
    return 0;
}

希望這可以幫助!

下面是用C語言解決這個問題的方法:

#include <stdio.h>
// functions that can be used push(), pop(), and isEmpty()
// the idea is to hold all the values in Function Call Stack until the stack becomes empty.
//When the stack becomes empty, we insert all the held items one by one at the bottom of the stack   
// stack-> 1 2 3 4 becomes 4 3 2 1 when we print
#define size 4
int stk[size];
int top = -1;
void insertAtLast(int element);
int isStackFull()
{
if(top == size - 1)
    return 1;
return 0;
}
void push(int val)
{
if(isStackFull()==1)
    return;
else
    //Task 2: Complete the logic
    stk[++top] = val;
}
int isStackEmpty()
{
//Task 1: Write logic for isStackEmpty()
if (top==-1)
    return 1;
return 0;
}
int pop()
{
if(isStackEmpty()==1)
    return -1;
else
    //Task 2: Complete the logic
    return stk[top--];
    
}
void reverse(){
if(isStackEmpty()==1){
    return;
}
int temp=pop();
reverse();

insertAtLast(temp);
}
void insertAtLast(int element){
 if(isStackEmpty()==1){
    push(element);   //imp
    return;
}

int topElements=pop();  //imp
insertAtLast(element);  //imp

push(topElements);
}
int main() {
push(4);
push(3);
push(2);
push(1);
for(int i=0;i<size;i++){
    printf("%d ", stk[i]);
}
printf("\n");
reverse();

for(int i=0;i<size;i++){
    printf("%d ", stk[i]);
}
return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM