自己动手“敲”微软100题系列二
来源:互联网 发布:软件设计师2016下半年 编辑:程序博客网 时间:2024/06/06 01:33
第二道题目如下:
那么栈是属于一种先入后出的线性表数据结构,这里的主要要求是求min、push以及pop的时间复杂度要求为O(1),虽然我没有上过专门的数据结构课程,
但是也知道不能去用for类似的循环去遍历整个栈,那么查找最小时,一个办法是在每次压栈时,把最小元素存起来,比如压入一个元素a,而之前栈的元素最小为min,那么
压入之后的最小元素肯定是a和min中的最小值,此时存入a的同时还需存储两者最小值。
参考了文档:微软面试100题系列by_July。 (以后不再赘述)
下面上代码:
//参考:http://www.cnblogs.com/caidaxia/archive/2011/10/14/2212369.html#include <iostream>#include <iomanip>using namespace std;//栈中一个数据单元,包含当前数据,已经栈在此时的最小数据struct MinStackData{int currentData;int minData;};//整个栈数据结构体struct MinStack{MinStackData *data;int m_nSize;int top;};//初始化栈,引用传递void initMinStack(MinStack &minStack,int size) {minStack.data=(MinStackData* )malloc(sizeof(MinStackData)*size);minStack.m_nSize=size;minStack.top=0;}//压入元素bool push(MinStack *minStack,int val){//int minVal;if (minStack->top == minStack->m_nSize){cout << "size overflow" << endl;return false;}minStack->data[minStack->top].currentData=val;if (minStack->top ==0){minStack->data[minStack->top].minData=val;}else {minStack->data[minStack->top].minData=( val < minStack->data[minStack->top-1].minData ) ? val: minStack->data[minStack->top-1].minData ;}minStack->top++;return true;}//弹出一个元素int pop(MinStack *minStack){if (minStack->top == 0){cout << "error: stack empty" << endl;return -1;}return minStack->data[--minStack->top].currentData;}//返回最小元素int min(MinStack *minStack){if (minStack->top == 0){cout << "error: stack empty" << endl;return -1;}return minStack->data[minStack->top-1].minData;}void main(){MinStack minStack;initMinStack(minStack,100);//向栈中随机添加5个元素for (int i=0;i<5;i++){int temp=rand()%10;if (push(&minStack,temp)){cout <<"push a value: " << temp<< endl;} cout <<"the min value is : " << min(&minStack) << endl;}cout <<"*****************" << endl;//每次出栈一个元素,测试找出的最小元素,for (int i=minStack.top;i>0;i--){cout <<"the min value is :" << min(&minStack) << endl;if (pop(&minStack)){cout <<"pop a value :" <<minStack.data[minStack.top].currentData << endl;}}//让控制台程序停留下getchar();}
下面的是运行结果:
0 0
- 自己动手“敲”微软100题系列二
- 自己动手“敲”微软100题系列一
- 自己动手“敲”微软100题系列三
- 自己动手“敲”微软100题系列四
- 《SSO系列二》自己动手写一个SSO
- 微软等100题系列
- 网友答案整理II:微软等面试100题系列之网友精彩回复 [二]
- 微软面试100系列 第32题
- 微软等面试100题系列 - 41
- 自己动手实现FleaJAVA框架 -- vb2005xu自己动手系列
- 自己动手写操作系统(二)
- 自己动手写操作系统(二)
- 自己动手学Remoting(二)
- 自己动手写俄罗斯方块(二)
- 自己动手写操作系统(二)
- 微软面试100题系列-第2题
- 微软面试100题系列-第3题
- 微软面试100题系列-第1题
- iOS在控制器中绘制圆形图像,二维码
- 23种设计模式C++实例之概述
- ARC下会导致内存泄漏的情况
- typedef定义函数类型
- 使用get请求下载文件的时候,由于地址栏用的是iso-8859-1编码格式产生乱码,得到不正确的值
- 自己动手“敲”微软100题系列二
- Java字符编码根本原理
- C++入门(2):操作符和控制结构
- 命令行选项
- Ugly Number
- C# string
- Objective-c语言_面向对象(继承)
- layer绘制渐变色
- [LeetCode]028-Implement strStr