【要求】如题
【代码】
代码语言:javascript复制// 如何仅用递归函数和栈操作逆序一个栈.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
#include <iostream>
#include <stack>
using namespace std;
//递归函数1:返回栈底元素并且删除
int getAndRemoveLastElement(stack<int> &stack) {
//递归终止条件
int num = stack.top();
stack.pop();
//如果是最后一个元素,那么弹出后必定为空
if (stack.empty())
return num;
else {
//如果不为空,说明num不是栈底元素,则需要递归
int tmp = getAndRemoveLastElement(stack);
//把不是栈底元素的num重新要入栈
stack.push(num);
return tmp;
}
}
//递归函数2:逆序一个栈
void reverse(stack<int> &stack) {
if (stack.empty())
return;
int i = getAndRemoveLastElement(stack);
reverse(stack);//最后reverse的那个元素一定是栈顶元素
stack.push(i);
}
int main(){
stack<int> stack;
//压入:1 2 3 4 5 6
for (int i = 1; i < 7; i ) {
stack.push(i);
}
reverse(stack);
for (int i = 1; i < 7; i ) {
int num = stack.top();
cout << num << " ";
stack.pop();
}
return 0;
}
【想法】 1. 要注意在C 中容器类作为参数传递默认的是值传递,所以要操作vector类型需要使用引用传递,就向上面代码一样。
2.区别一下:
- function1(vec),传入值
- function2(vec),传入引用
- function3(&vec),传入地址
区别在于:
- 会发生拷贝构造
- 不会发生拷贝构造
- 不会发生拷贝构造