堆栈反转算法

时间:2014-10-14 05:42:34

标签: c algorithm stack

我看到了一种不使用任何其他堆栈来反转堆栈的算法。我根据算法制作了C程序,但我真的不明白它是如何工作的。请帮我解释下面的代码。

#include<stdio.h>
void push(int item);
int pop();
void display();
void reverseStack();
void insertAtBottom(int);
typedef struct stack
{
    int data;
    struct stack* next;
} stack;
stack* top=NULL;
int main()
{
    push(5);
    push(13);
    push(16);
    push(17);
    display();
    pop();
    printf("Display before reversal\n");
    display();
    reverseStack();
    printf("Display after reversal\n");
    display();
    return 0;
}
void push(int data)
{
    stack* temp = malloc(sizeof(stack));
    temp->next=top;
    temp->data  = data;
    top = temp;
}
int pop()
{
    int a;
    stack* temp;
    temp = top;
    if(top == NULL)
        return -1;
    //printf("popped item=%d\n", temp->data);
    a = temp->data;
    top = top->next;
    free(temp);
    return a;
}
void display()
{
    stack* temp = top;
    while(temp!=NULL)
    {
        printf("%d\n", temp->data);
        temp = temp->next;
    }
}

void reverseStack()
{

    int data ;
    if(top != NULL)
    {
        data = pop();
        reverseStack();
        insertAtBottom(data);
    }
}

void insertAtBottom(int data)
{
    int a;
    if(top==NULL)
    {
        push(data);
        return;
    }
    a = pop();
    insertAtBottom(data);
    push(a);

}

上述程序按预期工作。但是算法是如何工作的,我不确定。请解释一下。

2 个答案:

答案 0 :(得分:1)

这里的关键功能是函数insertAtBottom

void insertAtBottom(int data)
{
    int a;
    if(top==NULL)
    {
        push(data);
        return;
    }
    a = pop();
    insertAtBottom(data);
    push(a);

}

它在堆栈底部而不是堆栈顶部插入数据。它是如何工作的?它以递归方式弹出堆栈中的所有元素,当堆栈最后为空时,它会添加新元素:

if(top==NULL)
{
     push(data);
     return;
}

然后它按照它们在堆栈中的顺序恢复所有存在的元素

a = pop();
/*insertAtBottom(data);*/
push(a);

我评论中间声明它会更清楚。

另一方面,函数reverseStack

void reverseStack()
{

    int data ;
    if(top != NULL)
    {
        data = pop();
        reverseStack();
        insertAtBottom(data);
    }
}

在堆栈底部插入元素调用函数insertAtBottom

假设堆栈具有值

顶部:1 2 3 4 底部:5

该函数首先以递归方式弹出堆栈中的所有元素

然后它推送堆栈中的最后一个元素

top->bottom: 5

然后在底部插入前一个元素

top: 5
bottom: 4
----------

等等

top:5
4
bottom: 3
----------

top: 5
4
3
bottom: 2
----------

top: 5
4
3
2
bottom: 1
----------

答案 1 :(得分:0)

您不需要另一个堆栈来反转堆栈。你可以在你的结构的一次迭代传递中做到这一点,你只需要一些局部变量来交换下一个指针:

void reverseStack()
{
    stack* it = top->next;
    top->next = NULL;
    while(it!=NULL)
    {   
        stack* temp = it->next;
        it->next = top;
        top = it;
        it = temp;
    }
}

PS:为空堆栈添加健全性检查取决于TO。