Validate Stack Sequences in C++


Suppose we have two sequences pushed and popped with distinct values, we have to find true if and only if this could have been the result of a sequence of the push and pop operations on an initially empty stack. So if the input is push = [1,2,3,4,5], and pop = [4,5,3,2,1], then the output will be true. We can use push(1), push(2), push(3), push(4), pop() : 4, push(5), pop() : 5, pop() : 3, pop() : 2, pop() : 1

To solve this, we will follow these steps −

  • Create one method called solve(). This will take pushed and popped arrays

  • define a stack st, set index := 0

  • for i in range 0 to size of pushed array

    • push pushed[i] into st

    • if popped[index] = stack top element, then

      • index := index + 1

      • pop from stack

      • while st is not empty, and popped[index] = top of st

        • index := index + 1

      • delete from st

  • while index < size of popped

    • if popped[index] = stack top, then

      • increase index by 1

      • delete from stack

    • otherwise come out from the loop

  • return true, when stack is empty

  • this solve method will be called from the main section like below −

  • return solve(pushed, popped)

Let us see the following implementation to get better understanding −

Example

 Live Demo

#include <bits/stdc++.h>
using namespace std;
class Solution {
   public:
   bool solve(vector<int>& pushed, vector<int>& popped){
      stack <int> st;
      int currentIndexOfPopped = 0;
      for(int i =0;i<pushed.size();i++){
         st.push(pushed[i]);
         if(popped[currentIndexOfPopped] == st.top()){
            currentIndexOfPopped++;
            st.pop();
            while(!st.empty() && popped[currentIndexOfPopped]==st.top()){
               currentIndexOfPopped++;
               st.pop();
            }
         }
      }
      while(currentIndexOfPopped <popped.size()){
         if (popped[currentIndexOfPopped]==st.top()){
            currentIndexOfPopped++;
            st.pop();
         }else{
            break;
         }
      }
      return st.empty();
   }
   bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {
      Solution s;
      bool flag = s.solve(pushed, popped);
      return flag;
   }
};
main(){
   vector<int> v = {1,2,3,4,5};
   vector<int> v1 = {4,5,3,2,1};
   Solution ob;
   cout << (ob.validateStackSequences(v, v1));
}

Input

[1,2,3,4,5]
[4,5,3,2,1]

Output

1

Updated on: 02-May-2020

289 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements