算法习题66:颠倒栈

来源:互联网 发布:淘宝客源码卷皮 编辑:程序博客网 时间:2024/06/05 02:26

颠倒栈。
题目:用递归颠倒一个栈。例如输入栈{1, 2, 3, 4, 5},1 在栈顶。
颠倒之后的栈为{5, 4, 3, 2, 1},5 处在栈顶。

---------------------------------

需要两中递归,一个是把底部元素找到,返回,然后最后压入,这样我们另一个递归从上至下,即可完成

注意要用引用,之前当成Java的写法,不用你引用,怎么改都不行,调试了才发现,引用和临时变量这种蛋疼的事


//============================================================================// Name        : ReverseStack.cpp// Author      : YLF// Version     :// Copyright   : Your copyright notice// Description : Hello World in C++, Ansi-style//============================================================================#include <iostream>#include <vector>using namespace std;class Stack{private:vector<int> stack;int size;public:Stack(){size=0;}~Stack(){}void Push(int va){stack.push_back(va);size++;}int Pop(){if(size == 0)return -1;int ret = stack.at(size-1);stack.pop_back();size--;return ret;}int Size(){return size;}bool isEmpty(){if(size == 0)return true;elsereturn false;}void Print(){int i = 0;for(i=stack.size()-1;i>=0;i--)cout<<"| "<<stack.at(i)<<" |"<<endl;cout<<"-----"<<endl;}};int BottomUp(Stack &stack);void ReverseStack(Stack &stack);int h(Stack &stack, int idx);int main() {Stack stack;int in;while(true){cin>>in;if(in != -1){stack.Push(in);}elsebreak;}stack.Print();ReverseStack(stack);stack.Print();return 0;}void ReverseStack(Stack &stack){if(stack.isEmpty()){cout<<"stack is empty!!";return;}int i = 0;int va=0;int size = stack.Size();for(i=0;i<size;i++){va = h(stack,i);stack.Push(va);}}/** * 改函数找到应该底朝天的那个元素返回 */int h(Stack &stack, int idx){int va = 0, cur = 0;if(idx == 0)return BottomUp(stack);else{cur = stack.Pop();va = h(stack,idx-1);stack.Push(va);return cur;}}/** * 返回最底下的元素 */int BottomUp(Stack &stack){int cur = stack.Pop();int ret = 0;if(stack.isEmpty())return cur;elseret = BottomUp(stack);stack.Push(cur);return ret;}


输出:
1 2 3 4 5 -1| 5 || 4 || 3 || 2 || 1 |-----| 1 || 2 || 3 || 4 || 5 |-----



原创粉丝点击