【问题描述】给出一个堆栈的输入序列,试判断一个序列是否能够由这个堆栈输出。如果能,返回总的出栈次数,如果不能,返回0。序列的输入及输出都是从左往右。(输入输出序列皆为整数且没有重复的数字,如果一个数字在输入序列中没有出现,那么其在输出序列中也不会出现)
【输入形式】第一行为输入序列的长度,第二行为输入序列的数字;第三行为输出序列的数字。输入数据以空格隔开。
【输出形式】如果是一个出栈序列,则返回总的出栈次数, 否则返回0
【样例输入】
5
1 2 3 4 5
1 2 3 4 5
【样例输出】5
【样例说明】第一行输入的是序列的长度,第一行输入的1 2 3 4 5 是输入序列,第三行是输出序列,以空格隔开,输出的总的出栈次数。
【评分标准】
#include<iostream>
#include<vector>
using namespace std;
class List {
private:
vector<int>L;
int z; //z为出栈次数
public:
//初始化
List() {
z = 0;
}
//判断一个序列是否能够由这个堆栈输出,M接收这个序列,T为输入序列
bool judge(vector<int>T, vector<int>M) {
vector<int>V; //V为出栈序列,最后判断是否与M相同
unsigned int i=0,j = 0;
while (i != T.size()) {
//每次比较之前都需判断栈是否为空
if (L.size() == 0) {
L.push_back(T[i]);
i++;
}
else if (L.back() == M[j]) {
V.push_back(L.back()); //若相同,则直接出栈
L.pop_back();
z++; j++;
}
else {
if (L.size() == 0) {
L.push_back(T[i]);
i++;
}
else {
if (L.back() != T[i]) {
L.push_back(T[i]); //若不相同,则T中元素入栈
i++;
}
}
}
}
int k = this->L.size();
for (int i = 0; i < k; i++) {
V.push_back(this->L.back()); //栈中剩余元素出栈
this->L.pop_back();
z++;
}
//出栈结果对比M,若相同则返回1,不同返回0
if (V == M)return true;
else return false;
}
//返回出栈次数
int size() {
return this->z;
}
};
int main() {
int n;
vector<int>T; vector<int>M;
List L;
cin >> n;
int m;
for (int i = 0; i < n; i++) {
cin >> m;
T.push_back(m);
}
for (int i = 0; i < n; i++) {
cin >> m;
M.push_back(m);
}
if (L.judge(T, M))cout << L.size();
else {
cout<<"0";
}
}