一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是只能用递归函数来实现,而不能用另外的数据结构。
给定一个栈Stack以及栈的大小top,请返回逆序后的栈。
测试样例:
[1,2,3,4,5],5
返回:[5,4,3,2,1]
kevinLee523
/*
Coding Interview Guide:用递归函数和栈操作逆序栈
题目大意:
一个栈依次压入1,2,3,4,5那么从栈顶到栈底分别为5,4,3,2,1。将这个栈转置后,从栈顶到
栈底为1,2,3,4,5,也就是实现了栈中元素的逆序,请设计一个算法实现逆序栈的操作,但是
只能用递归函数来实现,而不能用另外的数据结构。给定一个栈Stack以及栈的大小top,请
返回逆序后的栈。
测试样例:[1,2,3,4,5],5
返回:[5,4,3,2,1]
解题思路:
用一个递归函数,每次获取栈的最底部的元素并移除
*/
#include <iostream>
#include <vector>
using namespace std;
class ReverseStack {
public:
vector<int> reverseStackRecursively(vector<int> stack, int top)
{
vector<int> ret;
if (stack.empty())
return ret;
int k = getLastElem(stack);//获取最底部元素
stack = reverseStackRecursively(stack, top - 1);//递归调用
stack.push_back(k);//压入栈
return stack;
}
//获取stack最底部的元素并移除
int getLastElem(vector<int> &stack)
{
int top = stack.back();
stack.pop_back();
if (stack.empty())
return top;
else
{
int last = getLastElem(stack);
stack.push_back(top);
return last;
}
}
};
int main()
{
vector<int> v{ 1,2,3,4,5 };
ReverseStack obj;
vector<int> ret = obj.reverseStackRecursively(v, v.size());
for (auto num : ret)
cout << num << " ";
cout << endl;
}
//大家好,我是yishuihan,下面的思路清晰,可以参考;
//当某一个元素放入栈底部
void Push_Bottom(stack<int>& st,int value)
{
int tmp;
//如果栈为空,那么直接将当前元素压入栈
if(st.size()==0)
st.push(value);
else //如果栈中有元素,那么取出其中的元素,然后再将元素压入
{
tmp = st.top();
st.pop();
Push_Bottom(st,value);
st.push(tmp);
}
}
/*
翻转栈
*/
void Reverse_st(stack<int>& st)
{
int tmp;
if(st.size()<=1)
return;
else
{
//取出栈顶元素
tmp = st.top();
st.pop();
//递归调用,翻转剩余的元素
Reverse_st(st);
//将取出的元素放入栈底部
Push_Bottom(st,tmp);
}
}
import java.util.*;
说实话,这个题最开始没写到,应为自己总是想反转应该是全部反转,
然后看到大佬们的答案后,瞬间豁然开朗, 原来反转,如果在原数组里面,
直接从中间开始,向俩边交换就行了,还省空间。很棒!
并且自己对递归又加深了认识。!应为我在刷递归专题。若果有小伙伴,一起刷题的,可以加关注哦。讨论
public class ReverseStack {
public int[] reverseStackRecursively(int[] stack, int top) {
reve(stack,0);
return stack;
}
public void reve(int[] arr, int n){
if(n>=arr.length/2)
return;
reve(arr,n+1);
int temp = arr [n];
arr[n] = arr[arr.length-n-1];
arr[arr.length-n-1] = temp;
return;
}
}
//总共用了四行代码
//每次交换两个位置的值,比如top = 5;那么第一次交换的就是下标为0和下标为top-1的值
//第二次就是交换下标为1和下标为(top - 1)- 1的值
//因为stack的size是不会变的,变的是传的top
//因此下标为0可以用stack.size-top来表示,依次类推,因为每进入一个递归,top都会--
vector<int> reverseStackRecursively(vector<int> stack, int top) {
if (stack.size() - top >= top - 1 )
return stack;
swap(stack[stack.size() - top], stack[top - 1]);
return reverseStackRecursively(stack,--top);
}
class ReverseStack: def reverseStackRecursively(self, stack, top): # write code here if top == 1: return stack if top == 2: return stack[::-1] stack[0], stack[top-1] = stack[top-1], stack[0] return [stack[0]] + self.reverseStackRecursively(stack[1:top-1],top-2) + [stack[top-1]]掐头去尾,两者交换,然后递归
class ReverseStack {
public:
vector<int> reverseStackRecursively(vector<int> stack,int top) {
top--;
if(top==-1||top==0) return stack;
reverseStack(stack,top);
return stack;
}
int getAndRemoveLastElement(vector<int> &stack,int &top){
int res=stack[top--];
if(top==-1) return res;
int last=getAndRemoveLastElement(stack,top);
stack[++top]=res;
return last;
}
void reverseStack(vector<int> &stack,int &top){
if(top==-1) return;
int lastElement=getAndRemoveLastElement(stack,top);
reverseStack(stack,top);
stack[++top]=lastElement;
}
};
import java.util.*;
public class ReverseStack {
public int[] reverseStackRecursively(int[] stack, int top) {
// write code here
if (top == 0) return null;
return reverse(stack, 0, top - 1);
}
private int[] reverse(int[] stack, int begin, int end) {
if (begin >= end) {
return stack;
}
int tmp = stack[begin];
stack[begin] = stack[end];
stack[end] = tmp;
return reverse(stack, begin + 1, end - 1);
}
} import java.util.*;
public class ReverseStack {
public int getBottom(int[] stack,int top){
if(top==1)
return stack[top-1];
else{
int tmp=stack[top-1];
top--;
int bottom=getBottom(stack,top);
stack[top-1]=tmp;
top++;
return bottom;
}
}
public int[] reverseStackRecursively(int[] stack, int top) {
if(top<1){
return stack;
}
else{
int bottom=getBottom(stack,top--);
stack=reverseStackRecursively(stack, top);
stack[top++]=bottom;
return stack;
}
}
}
import java.util.*;
public class ReverseStack {
public int[] reverseStackRecursively(int[] stack, int top) {
recursion(stack,0);
return stack;
}
void recursion(int[] stack, int i){
if(i>=stack.length/2)
return;
recursion(stack,i+1);
int temp = stack[stack.length-i-1];
stack[stack.length-i-1] = stack[i];
stack[i] = temp;
return;
}
}
class ReverseStack {
public:
int getAndRemoveLast(vector<int>& stack){
int front=stack[stack.size()-1];
stack.pop_back();
if(stack.empty()){
return front;
}else{
int last=getAndRemoveLast(stack);
stack.push_back(front);
return last;
}
}
void reverseStack(vector<int>& stack){
if(stack.size()<2)
return;
else{
int last=getAndRemoveLast(stack);
reverseStack(stack);
stack.push_back(last);
}
}
vector<int> reverseStackRecursively(vector<int> stack, int top) {
reverseStack(stack);
return stack;
}
};
class ReverseStack
{
public int[] reverseStackRecursively(int[] stack, int top)
{
Reverse(stack,top-1);
return stack;
}
private void Reverse(int[] stack,int top){
if(top==0)
return;
else{
int current=stack[top];
top=top-1;
Reverse(stack,top);
AnotherReverse(stack,ref top,current);
}
}
private void AnotherReverse(int[] stack,ref int top,int value){
if(top==0){
int backup=stack[top];
stack[top]=value;
top++;
stack[top]=backup;
}else{
int current=stack[top];
top--;
AnotherReverse(stack,ref top,value);
top++;
stack[top]=current;
}
}
}
//如果不用递归,那么就是循环的将左右两边对称的数进行交换,例如对于数组{1,2,3,4,5},将1和5,2和4进行交换即可。用递归的话,就是根据第二个参数来交换。
public class ReverseStack {
public static void main(String args[]) {
int[] arr = new ReverseStack().reverseStackRecursively(new int[] { 1, 2, 3, 4, 5}, 5);
for (int x : arr)
System.out.print(x + " ");
}
public int[] reverseStackRecursively(int[] stack, int top) {
int temp = stack[stack.length - top];
stack[stack.length - top] = stack[top - 1];
stack[top - 1] = temp;
for (int i = 1; i < top / 2; i++) {
reverseStackRecursively(stack, top - i);
}
return stack;
}
}
import java.util.*;
public class ReverseStack {
public int[] reverseStackRecursively(int[] stack, int top) {
// write code here
int size = top;
if(size == 0){ // 已把栈抽空,开始回溯(反压)
return stack;
}
int i = getAndRemoveLastElement(stack, size);
size--;
reverseStackRecursively(stack, size);
stack[size] = i; // 把抽出的元素反压入栈
return stack;
}
/**
* 移除stack的栈底元素,其他元素不变
*
* @param stack
* @param size
* @return 返回所移除的栈底元素
*/
public int getAndRemoveLastElement(int[] stack, int size){
int last = stack[0];
for(int i = 0; i < size - 1; i++){
stack[i] = stack[i + 1];
}
return last;
}
}
/** * 思路:给你的参数是栈的大小top,每一次压栈,top--,向下标0移动,这时应该增加一个计数器,从0开始,每压一个栈就+1,这样与对应的元素进行颠倒存储在栈中 * 这里利用了每一个栈会保存当前栈的局部变量的特点。 */ importjava.util.*;