给定一个数字数组和一个堆栈。数组的所有元素都在堆栈内部。目标是找到获取单个数组元素所需的弹出操作计数。
堆栈以降序填充,第一个元素为最高,顶部元素为最低。
例如
Stack [ 7,6,2,1 ] array : 2,1,6,7输出结果
Count of number of pop operations on stack to get each element of the array are: 3 1 0 0
Traversing array from 0th index, To get 2 we will pop stack three times. So arr[0] is 3. First two pops will give 7 and 6 also. To get 1 we will pop stack once now. So arr[1] is 1. For 6 and 7 as these are already popped, so arr[2]=arr[3]=0.
Stack [ 3,2,1,1 ] array : 1,2,1,3输出结果
Count of number of pop operations on stack to get each element of the array are: 3 0 1 0
Traversing array from 0th index, To get 1 we will pop stack three times. So arr[0] is 3. First two pops will give 3 and 2also.Traversingarray from 0th index, To get 1 we will pop stack three times. So arr[0] is 3. First two pops will give 3 and 2 also.
以下程序中使用的方法如下-
在这种方法中,我们将使用unordered_map <int,bool> um来检查元素是否已经弹出。弹出元素并将其添加到um。如果再次出现,则将弹出计数设置为0。否则,将递增计数直到我们得到它为止。
取一个整数数组arr []。
拿一个stack <int> stck在其中存储元素。
按降序推入元素。
函数pop_operations(stack <int>&stck,int arr [],int elements)返回堆栈上弹出操作数的计数,以获取数组的每个元素。
将初始计数设为0。
使用unordered_map <int,bool> um来存储在堆栈上执行弹出操作时遇到的唯一编号。
使用for循环遍历数组。
取temp = arr [i]。
如果temp不在um中。要获取它,需要打印0次弹出操作。
否则,在找不到温度的情况下,执行堆栈弹出并将um中弹出的每个元素设置为true和递增计数。
在片刻结束时,打印计数。
这样,我们将为数组的每个元素打印弹出操作的计数。
#include <bits/stdc++.h> using namespace std; void pop_operations(stack<int>& stck, int arr[], int elements){ int count = 0; unordered_map<int, bool> um; cout<<"获取数组中每个元素的堆栈上弹出操作的数量计数为: "; for (int i = 0; i < elements; ++i){ int temp = arr[i]; if (um.find(temp) != um.end()) { cout << "0 "; } else{ count = 0; while (stck.top() != temp){ um[stck.top()] = true; stck.pop(); count++; } stck.pop(); count++; cout<<count<<" "; } } } int main(){ int elements = 4; int arr[] = { 2, 1, 6, 7}; stack<int> stck; stck.push(1); stck.push(2); stck.push(6); stck.push(7); pop_operations(stck, arr, elements); return 0; }输出结果
如果我们运行上面的代码,它将生成以下输出-
获取数组中每个元素的堆栈上弹出操作的数量计数为: 3 1 0 0