一个栈依次压入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]
/*
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.*;