微软面试100题系列-第2题

       注:微软面试100题系列中的题都是v_JULY_vhttp://blog.csdn.net/v_JULY_v)收集的面试题,具体PDF下载地址为:http://download.csdn.net/detail/v_july_v/4583815

                写文的目的是锻炼自己,欢迎各位大牛提出建议,批评指正~

       第二题,题目如下:

              设计包含 min函数的栈,

              定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素,

             要求函数 min、push 以及 pop 的时间复杂度都是 O(1)。

我的思考过程是这样的:

1.得到栈的最小元素,且时间复杂度为0(1),那么明显需要空间来保存当前的最小值;

2.必须在每次push进去的时候,都使用空间来保留当前的最小值,这样每次pop的时候都不再需要重复比较栈中剩余各值的大小;

3.是栈就有空间的大小限制。

代码如下:

//written by zero
#include<iostream>
#include<cstdlib>
#include<string>
using namespace std;

//栈中的最小元素
struct Item   
{
   int value;
   int min;   //当前栈中最小
};

//定义栈
class Stack
{
public:
   explicit Stack(int size):curCount(0),size(size)
   {
       data = new Item[size];  
   };

   ~Stack(){delete[] data;};

         void Push(int value)
	{
	     if (curCount == size)
	     {
		cout << "error:stack is full" << endl;
		return;
	     }
	     data[curCount].value = value;
	     if (curCount == 0)
		data[curCount].min = data[curCount].value;
	     else 
		data[curCount].min = data[curCount].value < data[curCount-1].min ? data[curCount].value : data[curCount-1].min;
	     ++curCount;
	}

	void Pop()
	{
	   if (curCount == 0)
	   {
		cout << "error:stack is empty" << endl;
		return;
	   }
	   --curCount;
	}

	string Min()
	{
	    if (curCount == 0)
	    { 
	        return "error:stack is empty";
	    }
	    char str[32];
             itoa(data[curCount-1].min,str,10);
	    return str;
	}

private:
   Item *data;
   int size;
   int curCount;
};
 
//测试栈
int main()
{
   Stack stack(3);   //设置大小为3
 
   stack.Push(8);
   cout << "min:" << stack.Min() << endl;  //应该输出8

   stack.Push(5);
   cout << "min:" << stack.Min() << endl;  //应该输出5

   stack.Push(3);
   stack.Push(3);   //应该报错,栈满
   cout << "min:" << stack.Min() << endl;   //应该输出3

   stack.Pop();
   cout << "min:" << stack.Min() << endl;   //应该输出5

   stack.Pop();
   cout << "min:" << stack.Min() << endl;   //应该输出8

   stack.Pop();
   stack.Pop();       //应该报错,栈空
   cout << "min:" << stack.Min() << endl;       //应该报错,栈空
}


 

运行截图:


    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值