logo

Stack Permutations

Prova-ho a GfG Practice ' title=

Tenim una pila buida i podem realitzar operacions push i pop. Ens donen dues matrius a[] i b[] on a[] representa l'ordre en què els elements s'empenyen a la pila i b[] representa l'ordre en què es treuen els elements de la pila. Trobeu si les seqüències push i pop donades són vàlides.

Exemples:  

xor en c++

Entrada: a[] = [1 2 3] b[] = [2 1 3]
Sortida: veritat
Explicació:   Premeu 1 i 2. Com que b[] requereix 2 primer pop 2 i després pop 1 a continuació. Finalment, premeu 3 i feu-lo caure. La seqüència push i pop coincideix amb a[] i b[].



Entrada: a[] = [1 2 3] b[] = [3 1 2]
Sortida: fals
Explicació: Després de prémer 1, 2 i 3, podem treure 3 segons sigui necessari. Però el següent element a b[] és 1 mentre que la part superior de la pila és 2. Com que 1 està bloquejat per sota de 2, aquest ordre no es pot aconseguir.

Taula de continguts

[Enfocament ingenu] Ús de la cua: temps O(n) i espai O(n).

La idea és simular les operacions de la pila mentre es fa un seguiment dels elements restants per processar-los cues .

Empengem els elements de a[] en ordre i per a cada element comprovem si coincideix amb la part frontal de b[] (l'ordre pop esperat). Si coincideix, l'eliminem de b[]; si no, l'empenyem a una pila. Després de cada empenta també comprovem la part superior de la pila si coincideix amb la part frontal de b[] sortim de la pila i la traiem de b[]. En repetir això, veiem si tots els elements de b[] es poden coincidir. En cas afirmatiu, la seqüència pop és vàlida; en cas contrari no ho és.

C++
#include    #include  #include  #include  using namespace std; bool checkPerm(vector<int>& a vector<int>& b) {  queue<int> q1;  for (int i = 0; i < a.size(); i++)   q1.push(a[i]);  queue<int> q2;  for (int i = 0; i < b.size(); i++)  q2.push(b[i]);  stack<int> st;    // Dequeue all items one by one  while (!q1.empty()) {  int ele = q1.front();  q1.pop();    if (ele == q2.front()) {    // If matches dequeue from output queue  q2.pop();    // Pop from stack while top matches q2 front  while (!st.empty() && !q2.empty() && st.top() == q2.front()) {  st.pop();  q2.pop();  }  }  else {  st.push(ele);  }  }    return q2.empty(); } int main() {  vector<int> a = {1 2 3};  vector<int> b = {3 2 1};    if (checkPerm(a b))  cout << 'true' << endl;  else  cout << 'false' << endl;  return 0; } 
Java
import java.util.LinkedList; import java.util.Queue; import java.util.Stack; public class GfG {  static boolean checkPerm(int[] a int[] b) {  Queue<Integer> q1 = new LinkedList<>();  for (int i = 0; i < a.length; i++)   q1.add(a[i]);  Queue<Integer> q2 = new LinkedList<>();  for (int i = 0; i < b.length; i++)  q2.add(b[i]);  Stack<Integer> st = new Stack<>();    // Dequeue all items one by one  while (!q1.isEmpty()) {  int ele = q1.poll();    if (ele == q2.peek()) {    // If matches dequeue from output queue  q2.poll();    // Pop from stack while top matches q2 front  while (!st.isEmpty() && !q2.isEmpty() && st.peek() == q2.peek()) {  st.pop();  q2.poll();  }  }  else {  st.push(ele);  }  }    return q2.isEmpty();  }  public static void main(String[] args) {  int[] a = {1 2 3};  int[] b = {3 2 1};    if (checkPerm(a b))  System.out.println('true');  else  System.out.println('false');  } } 
Python
from collections import deque def checkPerm(a b): q1 = deque(a) q2 = deque(b) st = [] # Dequeue all items one by one while q1: ele = q1.popleft() if ele == q2[0]: # If matches dequeue from output queue q2.popleft() # Pop from stack while top matches q2 front while st and q2 and st[-1] == q2[0]: st.pop() q2.popleft() else: st.append(ele) return not q2 if __name__ == '__main__': a = [1 2 3] b = [3 2 1] if checkPerm(a b): print('true') else: print('false') 
C#
using System; using System.Collections.Generic; public class GfG {  static bool checkPerm(int[] a int[] b) {  Queue<int> q1 = new Queue<int>(a);  Queue<int> q2 = new Queue<int>(b);  Stack<int> st = new Stack<int>();    // Dequeue all items one by one  while (q1.Count > 0) {  int ele = q1.Dequeue();    if (ele == q2.Peek()) {    // If matches dequeue from output queue  q2.Dequeue();    // Pop from stack while top matches q2 front  while (st.Count > 0 && q2.Count > 0 && st.Peek() == q2.Peek())  {  st.Pop();  q2.Dequeue();  }  }  else  {  st.Push(ele);  }  }    return q2.Count == 0;  }  public static void Main() {  int[] a = { 1 2 3 };  int[] b = { 3 2 1 };    if (checkPerm(a b))  Console.WriteLine('true');  else  Console.WriteLine('false');  } } 
JavaScript
function checkPerm(a b) {    // simulate queue with array  let q1 = a;     // simulate queue with array  let q2 = b;   let st = [];  // pointer for front of q1  let front1 = 0;     // pointer for front of q2  let front2 = 0;     while (front1 < q1.length) {  let ele = q1[front1];  front1++;  if (ele === q2[front2]) {  front2++;  // Pop from stack while top matches q2 front  while (st.length > 0 && st[st.length - 1] === q2[front2]) {  st.pop();  front2++;  }  } else {  st.push(ele);  }  }  return front2 === q2.length; } // Driver Code let a = [1 2 3]; let b = [3 2 1]; console.log(checkPerm(a b));  

Sortida
true 

[Enfocament esperat] Simulació de push i pop - O(n) temps i O(n) espai

En aquest enfocament, en realitat no creem cues ni modifiquem les matrius d'entrada. En canvi, simulem directament les operacions push i pop en una pila.

matriu java per llistar

Cada element d'a[] s'empeny a la pila un per un. Després de cada empenta, comprovem si la part superior de la pila coincideix amb l'element actual de b[]. Si ho fa, l'extraurem de la pila i avancem en b[]. Aquest procés es repeteix fins que tots els elements d'a[] s'han empès i comprovat. Si al final tots els elements de b[] s'han trobat correctament i s'han aparegut, la permutació és vàlida (retorn cert); en cas contrari, no és vàlid (retorna fals).

C++
#include    #include  #include  using namespace std; bool checkPerm(vector<int>& a vector<int>& b) {  stack<int> st;  int j = 0;  for (int i = 0; i < a.size(); i++) {    // Push top of a[] to stack  st.push(a[i]);  // Keep popping from stack while it  // matches front of the output queue  while (!st.empty() && st.top() == b[j]) {  st.pop();  j++;  }  }  return (j == b.size()); } int main() {  vector<int> a = {1 2 3};  vector<int> b = {2 1 3};  cout << (checkPerm(a b) ? 'true' : 'false') << endl;  return 0; } 
Java
import java.util.Stack; public class GfG {  static boolean checkPerm(int[] a int[] b) {  Stack<Integer> st = new Stack<>();  int j = 0;  for (int i = 0; i < a.length; i++) {    // Push top of a[] to stack  st.push(a[i]);  // Keep popping from stack while it  // matches front of the output array  while (!st.isEmpty() && st.peek().equals(b[j])) {  st.pop();  j++;  }  }  return (j == b.length);  }  public static void main(String[] args) {  int[] a = {1 2 3};  int[] b = {2 1 3};  System.out.println(checkPerm(a b) ? 'true' : 'false');  } } 
Python
def checkPerm(a b): st = [] j = 0 for i in range(len(a)): # Push top of a[] to stack st.append(a[i]) # Keep popping from stack while it # matches front of the output queue while st and st[-1] == b[j]: st.pop() j += 1 return j == len(b) if __name__ == '__main__': a = [1 2 3] b = [2 1 3] print('true' if checkPerm(a b) else 'false') 
C#
using System; using System.Collections.Generic; class GfG {  static bool checkPerm(int[] a int[] b) {  Stack<int> stack = new Stack<int>();  int j = 0;  for (int i = 0; i < a.Length; i++) {  // Push top of a[] to stack  stack.Push(a[i]);  // Keep popping from stack while it matches b[j]  while (stack.Count > 0 && stack.Peek() == b[j]) {  stack.Pop();  j++;  }  }  return j == b.Length;  }  static void Main() {  int[] a = { 1 2 3 };  int[] b = { 2 1 3 };  Console.WriteLine(checkPerm(a b) ? 'true' : 'false');  } } 
JavaScript
function checkPerm(a b) {  const stack = [];  let j = 0;  for (let i = 0; i < a.length; i++) {    // Push top of a[] to stack  stack.push(a[i]);  // Keep popping from stack while it  // matches front of the output queue  while (stack.length > 0 && stack[stack.length - 1] === b[j]) {  stack.pop();  j++;  }  }  return j === b.length; } //Driven Code const a = [1 2 3]; const b = [2 1 3]; console.log(checkPerm(a b) ? 'true' : 'false'); 

Sortida
true 
Crea un qüestionari