📜  在 O(n) 中不使用额外空间的情况下反转堆栈

📅  最后修改于: 2022-05-13 01:57:09.200000             🧑  作者: Mango

在 O(n) 中不使用额外空间的情况下反转堆栈

在不使用递归和额外空间的情况下反转堆栈。甚至功能堆栈也是不允许的。

例子:

Input : 1->2->3->4
Output : 4->3->2->1

Input :  6->5->4
Output : 4->5->6

我们在下面的帖子中讨论了一种反转堆栈的方法。
使用递归反转堆栈

上述解决方案需要 O(n) 额外空间。如果我们在内部将堆栈表示为链表,我们可以在 O(1) 时间内反转堆栈。反转堆栈需要反转链表,这可以通过 O(n) 时间和 O(1) 额外空间来完成。
请注意,push() 和 pop() 操作仍然需要 O(1) 时间。

C++
// C++ program to implement Stack
// using linked list so that reverse
// can be done with O(1) extra space.
#include
using namespace std;
 
class StackNode {
    public:
    int data;
    StackNode *next;
     
    StackNode(int data)
    {
        this->data = data;
        this->next = NULL;
    }
};
 
class Stack {
     
    StackNode *top;
     
    public:
     
    // Push and pop operations
    void push(int data)
    {
        if (top == NULL) {
            top = new StackNode(data);
            return;
        }
        StackNode *s = new StackNode(data);
        s->next = top;
        top = s;
    }
     
    StackNode* pop()
    {
        StackNode *s = top;
        top = top->next;
        return s;
    }
 
    // prints contents of stack
    void display()
    {
        StackNode *s = top;
        while (s != NULL) {
            cout << s->data << " ";
            s = s->next;
        }
        cout << endl;
    }
 
    // Reverses the stack using simple
    // linked list reversal logic.
    void reverse()
    {
        StackNode *prev, *cur, *succ;
        cur = prev = top;
        cur = cur->next;
        prev->next = NULL;
        while (cur != NULL) {
 
            succ = cur->next;
            cur->next = prev;
            prev = cur;
            cur = succ;
        }
        top = prev;
    }
};
 
// driver code
int main()
{
    Stack *s = new Stack();
    s->push(1);
    s->push(2);
    s->push(3);
    s->push(4);
    cout << "Original Stack" << endl;;
    s->display();
    cout << endl;
     
    // reverse
    s->reverse();
 
    cout << "Reversed Stack" << endl;
    s->display();
     
    return 0;
}
// This code is contribute by Chhavi.


Java
// Java program to implement Stack using linked
// list so that reverse can be done with O(1)
// extra space.
class StackNode {
    int data;
    StackNode next;
    public StackNode(int data)
    {
        this.data = data;
        this.next = null;
    }
}
 
class Stack {
    StackNode top;
 
    // Push and pop operations
    public void push(int data)
    {
        if (this.top == null) {
            top = new StackNode(data);
            return;
        }
        StackNode s = new StackNode(data);
        s.next = this.top;
        this.top = s;
    }
    public StackNode pop()
    {
        StackNode s = this.top;
        this.top = this.top.next;
        return s;
    }
 
    // prints contents of stack
    public void display()
    {
        StackNode s = this.top;
        while (s != null) {
            System.out.print(s.data + " ");
            s = s.next;
        }
        System.out.println();
    }
 
    // Reverses the stack using simple
    // linked list reversal logic.
    public void reverse()
    {
        StackNode prev, cur, succ;
        cur = prev = this.top;
        cur = cur.next;
        prev.next = null;
        while (cur != null) {
 
            succ = cur.next;
            cur.next = prev;
            prev = cur;
            cur = succ;
        }
        this.top = prev;
    }
}
 
public class reverseStackWithoutSpace {
    public static void main(String[] args)
    {
        Stack s = new Stack();
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        System.out.println("Original Stack");
        s.display();
 
        // reverse
        s.reverse();
 
        System.out.println("Reversed Stack");
        s.display();
    }
}


Python3
# Python3 program to implement Stack
# using linked list so that reverse
# can be done with O(1) extra space.
class StackNode:
     
    def __init__(self, data):
         
        self.data = data
        self.next = None
 
class Stack:
     
    def __init__(self):
          
        self.top = None
      
    # Push and pop operations
    def push(self, data):
     
        if (self.top == None):
            self.top = StackNode(data)
            return
         
        s = StackNode(data)
        s.next = self.top
        self.top = s
      
    def pop(self):
     
        s = self.top
        self.top = self.top.next
        return s
  
    # Prints contents of stack
    def display(self):
     
        s = self.top
         
        while (s != None):
            print(s.data, end = ' ')
            s = s.next
         
    # Reverses the stack using simple
    # linked list reversal logic.
    def reverse(self):
 
        prev = self.top
        cur = self.top
        cur = cur.next
        succ = None
        prev.next = None
         
        while (cur != None):
            succ = cur.next
            cur.next = prev
            prev = cur
            cur = succ
         
        self.top = prev
     
# Driver code
if __name__=='__main__':
     
    s = Stack()
    s.push(1)
    s.push(2)
    s.push(3)
    s.push(4)
     
    print("Original Stack")
    s.display()
    print()
      
    # Reverse
    s.reverse()
  
    print("Reversed Stack")
    s.display()
      
# This code is contributed by rutvik_56


C#
// C# program to implement Stack using linked
// list so that reverse can be done with O(1)
// extra space.
using System;
 
public class StackNode
{
    public int data;
    public StackNode next;
    public StackNode(int data)
    {
        this.data = data;
        this.next = null;
    }
}
 
public class Stack
{
    public StackNode top;
 
    // Push and pop operations
    public void push(int data)
    {
        if (this.top == null)
        {
            top = new StackNode(data);
            return;
        }
        StackNode s = new StackNode(data);
        s.next = this.top;
        this.top = s;
    }
     
    public StackNode pop()
    {
        StackNode s = this.top;
        this.top = this.top.next;
        return s;
    }
 
    // prints contents of stack
    public void display()
    {
        StackNode s = this.top;
        while (s != null)
        {
            Console.Write(s.data + " ");
            s = s.next;
        }
        Console.WriteLine();
    }
 
    // Reverses the stack using simple
    // linked list reversal logic.
    public void reverse()
    {
        StackNode prev, cur, succ;
        cur = prev = this.top;
        cur = cur.next;
        prev.next = null;
        while (cur != null)
        {
            succ = cur.next;
            cur.next = prev;
            prev = cur;
            cur = succ;
        }
        this.top = prev;
    }
}
 
public class reverseStackWithoutSpace
{
    // Driver code
    public static void Main(String []args)
    {
        Stack s = new Stack();
        s.push(1);
        s.push(2);
        s.push(3);
        s.push(4);
        Console.WriteLine("Original Stack");
        s.display();
 
        // reverse
        s.reverse();
 
        Console.WriteLine("Reversed Stack");
        s.display();
    }
}
 
// This code is contributed by Arnab Kundu


Javascript


输出:

Original Stack 
4 3 2 1
Reversed Stack 
1 2 3 4