栈的面试题总结
来源:互联网 发布:手机淘宝图片最佳尺寸 编辑:程序博客网 时间:2024/05/22 23:28
1.不用辅助空间实现栈的逆序(利用函数的递归)
例如栈中元素1 2 3 4,逆序后栈中元素为4 3 2 1
int GetLastNumOfStack(stack<int>& s)// 得到栈顶的元素{ int result = s.top();//取栈顶元素 s.pop();//出栈 if(s.empty()==true) return result;//若是栈顶元素,则将该元素返回到上级函数 int last = GetLastNumOfStack(s);//接受返回的栈顶元素 s.push(result);//并将此时出栈的元素压入栈中(除栈顶元素外) return last;//将栈顶元素返回到上级函数}void ReseriveStack(stack<int>& s)//利用递归实现栈元素逆序{ if(s.empty()==true) return; int i = GetLastNumOfStack(s);//得到第一个栈底元素 ReseriveStack(s);//函数递归 s.push(i);//元素压栈}
测试代码
int main(){ stack<int> s; s.push(1); s.push(2); s.push(3); ReseriveStack(s); return 0;}
2.得到GetMin功能的栈
- 方法一:
#include<stdio.h>#include<stack>#include<iostream>using namespace std;#include<stack>template<class T>class Stack{public: Stack() {} void Push(const T& data) { StackData.push(data); if(StackMin.empty() || StackMin.top() > data) StackMin.push(data); else StackMin.push(StackMin.top());//StackData的值和StackMin元素的个数相同 } void Pop() { if(StackData.empty()) return; StackData.pop(); StackMin.pop(); } T GetMin() { return StackMin.top(); }private: stack<T> StackData; stack<T> StackMin;};
- 方法二:
#include<stack>template<class T>class Stack{public: Stack() {} void Push(const T& data) { StackData.push(data); if(StackMin.empty() || StackMin.top() > data) StackMin.push(data); } void Pop() { if(StackData.empty()) return; int value = StackData.top(); StackData.pop(); if(value == StackMin.top()) StackMin.pop(); } T GetMin() { return StackMin.top(); }private: stack<T> StackData; stack<T> StackMin;};
测试代码:
void funtest(){ Stack<int> s; s.Push(4); s.Push(1); s.Push(3); s.Push(2); s.Push(5); s.Pop(); int ret = s.GetMin();}int main(){ funtest(); getchar(); return 0;}
两种方法的比较:
两种方法的时间复杂度都相同,都为O(1),且空间复杂度都为O(N);区别是:方法一中StackData入栈的时候要浪费空间,但是弹出的时候节省时间,方法二中StackData入栈的时候要节省空间,但弹出时浪费时间。
3.由两个栈实现一个队列
template<class T>class Queue{public: Queue() {} void Push(const T& value) { StackPush.push(value); } void Pop() { if(StackPop.empty() && StackPush.empty()) return; if(StackPop.empty()) { while(!StackPush.empty()) { int num = StackPush.top(); StackPop.push(num); StackPush.pop(); } } StackPop.pop(); }private: stack<int> StackPush; stack<int> StackPop;};
测试代码:
int main(){ Queue<int> q; q.Push(1); q.Push(2); q.Push(3); q.Push(4); q.Pop(); getchar(); return 0;}
4.用一个栈来实现另一个栈的排序,要求栈由栈顶到栈底从大到小
void SortStackByStack(stack<int>& stackData){ //由题意知,stackData由栈顶到栈底从大到小排序,则help由栈顶到栈底从小到大排序 stack<int> help; if(stackData.empty()) return; while(!stackData.empty()) { int value = stackData.top(); stackData.pop(); if(help.empty() || value <= help.top()) help.push(value); if(value > help.top()) { while(!help.empty() && value > help.top()) { int num = help.top(); help.pop(); stackData.push(num); } stackData.push(value); } } while(!help.empty()) { int ret = help.top(); help.pop(); stackData.push(ret); }}
测试代码:
void funtest(){ stack<int> s; s.push(6); s.push(5); s.push(4); s.push(3); s.push(2); s.push(1); SortStackByStack(s);}int main(){ funtest(); getchar(); return 0;}
阅读全文
0 0
- 栈的面试题总结
- 栈面试题总结
- 真实的面试题总结
- 面试题的一些总结
- 常见的面试题总结
- 总结的一些面试题
- 总结的网络面试题
- 栈、队列面试题总结
- 链表相关的面试题总结
- 关于字符串的面试题总结
- 自己总结的一些flex 面试题
- 关于线程的面试题总结
- 最近的面试笔试题总结
- 比较好的面试题总结
- C++的一些笔试面试题总结
- 面试时总结的面试题
- const的作用总结(面试题)
- 关于数组的面试题总结(一)
- html内部链接实现
- Datawindow实现单双行显示不同颜色
- C++ 在类里面使用多线程技术
- html定义标签
- php 引入微信的js-sdk 报签名不合法的解决方案
- 栈的面试题总结
- 单向链表并交集问题
- 解决电脑没有语言输入法问题
- 考试排名(结构体的运用)
- html定义不同文件定义标签
- linux du
- 周笔记(20/52)
- Github全面详解-19课后作业04
- html中放大文件的一个方法