版权声明:我的GitHub:https://github.com/617076674。真诚求星! https://blog.csdn.net/qq_41231926/article/details/84798671
我的数据结构与算法题目集代码仓:https://github.com/617076674/Data-structure-and-algorithm-topic-set
原题链接:https://pintia.cn/problem-sets/15/problems/837
题目描述:
知识点:栈、队列
思路:双栈实现队列
设置两个栈stack1和stack2,其容量分别是N1和N2,且满足N1 <= N2。
入栈操作如下:
(1)如果stack1未满,则将新元素压入stack1中。
(2)如果stack1满了且stack2为空,将stack1中的元素倒压入stack2中,由于N1 <= N2,我们不必担心stack2容量不够的问题。将新元素压入stack1中。
(3)如果stack1满了且stack2不为空,说明此时已满,无法压入新元素,输出"ERROR:Full"。
出栈操作如下:
(1)如果stack2不为空,弹出stack2的栈顶元素。
(2)如果stack2为空且stack1不为空,则将stack1中的元素倒压入stack2中,再弹出stack2的栈顶元素。
(3)如果stack2为空且stack1也为空,说明此时无任何元素,输出"ERROR:Empty"。
时间复杂度和输入的数据规模及操作有关。空间复杂度是O(N1 + N2)。
C++代码:
#include<iostream>
#include<string>
#include<stack>
using namespace std;
int main() {
int N1, N2;
cin >> N1 >> N2;
if(N1 > N2) { //确保N1 <= N2
int temp = N1;
N1 = N2;
N2 = temp;
}
string str1, str2;
stack<string> stack1, stack2; //stack1的容量为N1,stack2的容量为N2
while(true) {
cin >> str1;
if(str1[0] == 'T') {
break;
} else if(str1[0] == 'A') {
cin >> str2;
if(stack1.size() < N1) {
stack1.push(str2);
} else if(stack1.size() == N1 && stack2.empty()) {
while(!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
stack1.push(str2);
} else if(stack1.size() == N1 && !stack2.empty()) {
cout << "ERROR:Full" << endl;
}
} else if(str1[0] == 'D') {
if(!stack2.empty()) {
cout << stack2.top() << endl;
stack2.pop();
} else {
if(stack1.empty()) {
cout << "ERROR:Empty" << endl;
} else {
while(!stack1.empty()) {
stack2.push(stack1.top());
stack1.pop();
}
cout << stack2.top() << endl;
stack2.pop();
}
}
}
}
return 0;
}
C++解题报告: