算法习题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 |-----
- 算法习题66:颠倒栈
- 算法题30 颠倒栈
- 66 颠倒栈
- 递归算法颠倒栈中的元素
- 【算法】用递归颠倒一个栈
- 栈的颠倒算法 递归实现
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 颠倒栈
- 链表的颠倒算法
- 递归颠倒栈
- Storm集群安装
- B. Fence
- Linux时间子系统之六:高精度定时器(HRTIMER)的原理和实现
- linux内核中读写文件
- C++必知必会之(8)指向指针的指针
- 算法习题66:颠倒栈
- Maven按照目标环境生成指定可执行的jar
- Syntax error: word unexpected (expecting ")")错误的解决方法
- 仿网易新闻效果源码分析
- linux 查看文件系统
- eclipse中几种加入jar包方式的区别
- Linux 下Sqlite3 的安装及应用
- java泛型List
- ios中的线程安全单例实现