How to sort a stack using only Push, Pop, Top, IsEmpty, IsFull?

前端 未结 10 1970
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-06 09:26

Given a stack S, need to sort the stack using only Push, Pop, Top, IsEmpty, IsFull.

Looking for most sim

相关标签:
10条回答
  • 2021-02-06 10:05

    What temporary data structures can you use? With push and pop, and no temporary storage for n elements, accessing data near the bottom of the stack would be impossible without storing the rest -somewhere-.

    If top (equiv to {x=pop();push(x);return x}) was replaced with shift, it would be perfectly doable - the stack would change into fifo (shift+push; pop would fall into disuse) and it would allow for an easy bubblesort on currently available elements.

    0 讨论(0)
  • //A java version

    public static void sort(Stack<Integer> s){
        if(s.size() > 0){
            int tmp = s.pop();
            sort(s);
            sortFromBottom(s, tmp);
        }
    }
    
    private static void sortFromBottom(Stack<Integer> s, Integer value){
        if(s.size() == 0){
            s.add(value);
        }else{
            int tmpValue = s.peek();
            if(tmpValue < value){
                s.pop();
                sortFromBottom(s, value);
                s.push(tmpValue);
            }else{
                s.push(value);
            }
        }
    }
    
    0 讨论(0)
  • 2021-02-06 10:07

    Sorting a stack without extra space is quite not a possibility . At least not coming to my sane mind . We can surely use the recursion stack as extra space over here . The below approach might be helful .

    My approach is O(N**2) . Over here I am iterating over stack N times, every time fixing the ith element in the stack .

    Firstly fixed the bottom element by popping out N elements and pushing min_element and in Second try fixed the 2nd element from bottom by popping out N-1 elements and pushing min_element except the one pushed before this And so on .

    Refer to the code below for more details .

        stack<int> stk;
        int sort_util(stack<int> &stk,int n,int mn)
        {
            if(n==0)
            {
                stk.push(mn);
                return mn;
            }
    
            int vl = stk.top();
            stk.pop();
    
            int fmin = sort_util(stk,n-1,min(mn,vl));
    
            if(fmin==vl)
                return INT_MAX;
            else
                stk.push(vl);
    
            return fmin;
        }
    
        void sort_stack(stack<int> &stk)
        {
            for(int i=stk.size();i>1;i--)
                sort_util(stk,i,stk.top());
        }
    
    0 讨论(0)
  • 2021-02-06 10:08

    Bubble Sort and Insert Sort in Java https://github.com/BruceZu/sawdust/blob/82ef4729ee9d2de50fdceab2c8976d00f2fd3ba0/dataStructuresAndAlgorithms/src/main/java/stack/SortStack.java

     /**
      * Sort the stack using only Stack API, without using other data structure
      * Ascending from bottom to top
     */
    public class SortStack<T extends Comparable<T>> {
     int sorted;
    
    /**
     * Just Bubble Sort.
     */
    private void bubble(Stack<T> s, T max) {
        if (s.empty() || s.size() == sorted) {
            s.push(max);
            sorted++;
            return; // note return
        }
    
        T currentTop = s.pop();
        if (max.compareTo(currentTop) < 0) {
            T tmp = max;
            max = currentTop;
            currentTop = tmp;
        }
    
        bubble(s, max);
        s.push(currentTop);
    }
    
    public Stack<T> sortAscending(Stack<T> s) {
        sorted = 0;
        if (s == null || s.size() <= 1) {
            return s;
        }
    
        while (sorted != s.size()) {
            bubble(s, s.pop());
        }
        return s;
    }
    
    /**
     * Just Insert Sort.
     */
    private void insertSort(Stack<T> s) {
        if (s.empty()) {
            return;
        }
        T currentTop = s.pop();
        insertSort(s);
        insert(s, currentTop);
    }
    
    private void insert(Stack<T> s, T insert) {
        if (s.isEmpty() || insert.compareTo(s.peek()) <= 0) {
            s.push(insert);
            return;
        }
    
        T current = s.pop();
        insert(s, insert);
        s.push(current);
    }
    
    public Stack<T> sortAscendingByInsertSort(Stack<T> s) {
        if (s == null || s.size() <= 1) {
            return s;
        }
        insertSort(s);
        return s;
     }
    }
    
    0 讨论(0)
提交回复
热议问题