Linux网络编程基础_4_网络层(六)--移动IP与网络层设备
2014-03-16 19:44
337 查看
问题描述,实现一个栈,要求push,pop,min(返回最小值的操作)的时间复杂度为O(1)。
思路1:模拟实现一个栈,在成员变量中一个int类型的变量,用来保存最小值,每当push一个数据,都将push的数据与变量中保存的数据进行对比,如果,push数据小于保存的值,那么就将最小值更新为push进来的数据,反之,则不用替换。假想push(2,3,4,1),那么最后保存的最小值是1,时间复杂度也将会是1,因为操作的次数为常数。但是这种思路是错误的,原因在于,pop数据的时候不会更新最小数据,试想上面的例子,将1 pop出去,那么最小的值就变成了2,可是变量里面还是1,没有更新数据导致程序逻辑错误。
思路2:使用两个栈结构来维护两段内存,一个存储正常push的数据,一个存储最小数据。
那么,这么样就不用为更新最小数据而头疼。
1.定义一个类似栈结构的结构体(当然可以实现为模板将会更加方便)
1).s维护的内存,正常压入数据
2).minstack维护的内存,当minstack._size == 0的时候,压入第一个数据,当要压入第二个数据的时候,需要和minstack维护的栈的top数据进行比较,如果压入数据比当前minstack的top数据小,则压入,否则则不压入。
左边为s维护的栈结构,右边为minstack维护的栈结构
4.pop函数的实现细节
1).首先由push会知道 s.top() >= minstack.top() 是恒成立的。
2).取到即将要被s栈即将要被pop出去的数据,用数据与minstack栈顶元素作比较,如果[b]s.top() > minstack.top() 则只将s栈的栈顶元素pop出去而不用pop minstack的栈顶元素。如果[b]s.top() == minstack.top(),则将s栈和minstack栈 的元素统统pop出去。[/b][/b]
[b][b]
[/b][/b]
[b][b] 5.min实现细节
[/b][/b]
[b][b]1).返回minstack的栈顶元素[/b][/b]
[b][b]
[/b][/b]
[b][b] 6.测试用例
[/b][/b]
本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1762137
思路1:模拟实现一个栈,在成员变量中一个int类型的变量,用来保存最小值,每当push一个数据,都将push的数据与变量中保存的数据进行对比,如果,push数据小于保存的值,那么就将最小值更新为push进来的数据,反之,则不用替换。假想push(2,3,4,1),那么最后保存的最小值是1,时间复杂度也将会是1,因为操作的次数为常数。但是这种思路是错误的,原因在于,pop数据的时候不会更新最小数据,试想上面的例子,将1 pop出去,那么最小的值就变成了2,可是变量里面还是1,没有更新数据导致程序逻辑错误。
思路2:使用两个栈结构来维护两段内存,一个存储正常push的数据,一个存储最小数据。
那么,这么样就不用为更新最小数据而头疼。
1.定义一个类似栈结构的结构体(当然可以实现为模板将会更加方便)
typedef struct _stack { _stack() :_capacity(5) , _size(0) { _array = new int[5]; } ~_stack() { if (_array) { delete[] _array; _array = NULL; } } int* _array; //存储数据的数组 int _capacity; //容量 int _size; //有效数据 }stack;2.定义一个类来管理两个结构体的对象
class Stack { public: Stack() :s() , minstack() {} bool pop(int* e) { if (s._size == 0) { return false; } int value = s._array[--s._size]; if (value == minstack._array[minstack._size - 1]) { --minstack._size; } *e = value; return true; } bool push(int value) { if (s._size >= s._capacity) { s._capacity = s._capacity * 2; int* tmp = new int[s._capacity]; int* cmp = new int[s._capacity]; for (int i = 0; i < s._size; i++) { tmp[i] = s._array[i]; } for (int i = 0; i < minstack._size; i++) { cmp[i] = minstack._array[i]; } delete[] s._array; delete[] minstack._array; s._array = tmp; minstack._array = cmp; } /* if (s._size == s._capacity) { return false; } */ if (minstack._size == 0 || value <= minstack._array[minstack._size - 1]) { minstack._array[minstack._size++] = value; } s._array[s._size++] = value; return true; } bool min(int* pMin) { if (minstack._size == 0) { return false; } *pMin = minstack._array[minstack._size - 1]; return true; } private: stack s; //用来维护正常数据栈 stack minstack; //用来维护最小数据栈 };3.push函数实现细节
1).s维护的内存,正常压入数据
2).minstack维护的内存,当minstack._size == 0的时候,压入第一个数据,当要压入第二个数据的时候,需要和minstack维护的栈的top数据进行比较,如果压入数据比当前minstack的top数据小,则压入,否则则不压入。
左边为s维护的栈结构,右边为minstack维护的栈结构
4.pop函数的实现细节
1).首先由push会知道 s.top() >= minstack.top() 是恒成立的。
2).取到即将要被s栈即将要被pop出去的数据,用数据与minstack栈顶元素作比较,如果[b]s.top() > minstack.top() 则只将s栈的栈顶元素pop出去而不用pop minstack的栈顶元素。如果[b]s.top() == minstack.top(),则将s栈和minstack栈 的元素统统pop出去。[/b][/b]
[b][b]
[/b][/b]
[b][b] 5.min实现细节
[/b][/b]
[b][b]1).返回minstack的栈顶元素[/b][/b]
[b][b]
[/b][/b]
[b][b] 6.测试用例
[/b][/b]
void Test() { Stack s; s.push(9); s.push(7); s.push(10); s.push(5); s.push(8); s.push(1); cout << "压入序列9 7 10 5 8 1" << endl; cout << "弹出序列" << endl; int value; while (s.pop(&value)) { cout << "pop " << value << "\t"; if (s.min(&value)) cout << "min value : " << value << endl; else cout << "there is no min value!" << endl; } }以上就是本人在做本道面试题的一些想法,分享给大家。
本文出自 “做一个小小小司机” 博客,请务必保留此出处http://10799170.blog.51cto.com/10789170/1762137
相关文章推荐
- Java基础-网络编程之IP和端口号
- java网络编程基础 TCP/IP OSI
- 五、Linux网络编程-TCP/IP基础(五)滑动窗口协议、UDP特点、UDP报文格式
- linux网络设备应用与驱动编程学习笔记(2)——网络驱动基础
- c#网络编程之TCP/IP(一)C#线程任务基础Thread
- java网络编程基础夯实03-为什么不能直接通过IP访问网站
- Java网络编程基础(二)-- 基于TCP/IP的Socket编程
- 三、Linux网络编程-TCP/IP基础(三)IP数据报格式、网际校验和、路由
- linux网络编程之TCP/IP基础
- 主机地址linux网络编程之TCP/IP基础(二):利用ARP和ICMP协议解释ping命令
- JAVA基础 day25 网络编程 IP类 UDP,TCP传输学习 简易聊天工具 TCP并发学习
- 一、Linux网络编程-TCP/IP基础(一)ISO/OSI参考模型、TCP/IP四层模型、基本概念
- 网络编程基础--TCP/IP
- linux网络编程之TCP/IP基础(二):利用ARP和ICMP协议解释ping命令
- linux网络编程之TCP/IP基础(三):IP数据报格式和IP地址路由
- 二、Linux网络编程-TCP/IP基础(二)MTU、路径MTU、以太网帧格式、ICMP、ARP、RARP
- 网络编程基础(1)-协议概要-IP、ICMP、UDP
- python网络编程基础(1)ip、端口等基础知识
- Java网络编程基础知识(IP/端口/协议)
- 网络编程之TCP/IP基础