设计包含min 函数的栈(push\pop\min)



一、题目:(感谢 http://blog.csdn.net/v_JULY_v 提供的题目)
设计包含min 函数的栈。
定义栈的数据结构,要求添加一个min 函数,能够得到栈的最小元素。
要求函数min、push 以及pop 的时间复杂度都是O(1)。

二、题目分析:
栈,仅在表尾进行插入和删除操作的线性表,具有后进先出的特性。

要完成这道题目,push、pop函数眨下眼睛就能写出来,问题时如何编写min函数使其能输出栈中最小元素且其时间复杂度为O(1)?

看了网上一些答案,发现这问题能用辅助栈记录最小元素的方式来解决,即每插入一个元素入栈同时把其最小元素push入辅助栈。
(保证辅助栈的栈顶为最小的元素,在入栈是只需要比较辅助栈的栈顶即可判断该元素是否是栈中的最小元素)

在pop栈顶元素时,只需把辅助栈的栈顶一起删除即可。

**辅助栈中的任意元素,必须为元素栈中由栈底至其相同位置的元素中的最小元素

三、代码:
//添加一个辅助栈,用于记录当前栈中最小的元素


#include<iostream>
using namespace std;

const int StackSize=10; //栈默认大小

class stack
{
public :
	void ini();//初始化
	void push(int x);//入栈
	void pop();//出栈
	void printStack();//输出栈中所有元素
	void printMinStack();//输出栈中最小元素
	void printAidStack();//输出辅助栈中所有元素
private :
	int stackArray[StackSize];//保存栈元素
	int minStack[StackSize];//保存栈中最小元素
	int size;//栈大小
};

void stack::ini()
{
	size = -1;
}


void stack::push(int x)
{
	if(size == StackSize - 1) throw "上溢出";
	else
	{
		size++;

		if(size == 0) minStack[size] = x;
		else
		{
			if(x < minStack[size-1]) minStack[size] = x;
			else minStack[size] = minStack[size-1];
		}
		stackArray[size] = x;
	}
}

void stack::pop()
{
	cout<<"删除栈顶元素."<<endl;
	if(size == -1) throw "下溢出";
	else{size--;}
}

void stack::printStack()
{
	cout<<"栈\t:";
	for(int i=0;i<=size;i++)
	{
		cout<<stackArray[i]<<"  ";
	}
	cout<<endl;
}

void stack::printAidStack()
{
	cout<<"辅助栈\t:";
	for(int i=0;i<=size;i++)
	{
		cout<<minStack[i]<<"  ";
	}
	cout<<endl;
}

void stack::printMinStack()
{
	cout<<"THE MIN IS : "<<minStack[size]<<endl;
}

void main()
{
	
	stack st;
	st.ini();
	st.push(65);
	st.push(423);
	st.push(568);
	st.push(14);
	st.push(40);
	st.push(62);
	st.printStack();
	st.printAidStack();
	st.pop();
	st.printStack();
	st.printAidStack();

	st.printMinStack();

}

截图:


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值