求栈中元素的最小值c语言,C语言深化(二)设计可以求最小元素的栈

#include

#include

#include

using namespace std;

/**

题目:

定义栈的数据结构 要求添加一个min函数,找出栈的最小元素

要求min、push、pop函数的时间复杂度都为O(1)

思路

牢牢把握住栈【先进后出】的特性,模拟各种实际情况,得出算法

栈结构体中添加一个辅助栈,这里称为【最小值栈】,存储最小值的历史记录

所以该最小值栈的栈顶即为当前栈的最小元素

当push进来的元素值大于、等于最小值栈的栈顶,最小值栈不变

因为根据栈的特性,只有当前最小值元素上面的所有元素都出去的时候,该最小值元素才能pop出去

反之,则将该元素放进最小值栈

当pop出去的元素不是最小值栈栈顶,则最小值栈不变

反之,最小值栈pop出栈顶

这样如果pop出去的值为当前最小值,则最小值栈也pop出一个元素

此时最小值栈的栈顶就是下一个最小值元素

*/

/*

创建栈结点结构体

value值

nextNode下一个结点

push()入栈函数

pop()出栈函数

min()求最小值函数

push2()入栈并且求最小值

pop2()出栈并且求最小值

*/

struct StackNode{

int value;

static StackNode * minNode;

StackNode * nextNode;

/**

push()入栈函数

value入栈的值

返回栈顶

*/

StackNode * push(int value){

StackNode * top = new StackNode();

if(NULL!=this){

top=this;

StackNode * push = new StackNode();

push->value=value;

push->nextNode=top;

top=push;

}else{

top->nextNode=NULL;

top->value=value;

}

cout<

return top;

}

/**

pop()出栈函数

返回栈顶

*/

StackNode* pop(){

if(NULL!=this){

cout<value<

return this->nextNode;

}

else{

cout<

return this;

}

}

/**

求最小值函数

flag判断是push还是pop

valuepush的值或者pop出去的值

*/

void min(bool flag,int value){

//push

if(flag){

//非空

if(NULL!=minNode){

//push进来的值小于等于原来的最小值,则push进入最小值栈

if(value<=minNode->value){

cout<

minNode=minNode->push(value);

}

}else{

//空,则直接放进去

cout<

cout<

minNode=minNode->push(value);

}

}else{

//pop

//非空且pop的值等于最小值,则最小值栈pop

if((NULL!=minNode)&&(minNode->value==value)){

cout<

minNode=minNode->pop();

}

}

if(NULL!=minNode)

cout<value<

}

//push+min

StackNode* push2(int value){

StackNode* node=this->push(value);

this->min(true,value);

return node;

}

//pop+min

StackNode* pop2(){

int value = this->value;

StackNode* node=this->pop();

this->min(false,value);

return node;

}

};

//结构体静态变量初始化!

StackNode * StackNode::minNode = NULL;

StackNode * stack;

void main()

{

stack=stack->push2(5);

stack=stack->push2(2);

stack=stack->push2(4);

stack=stack->push2(1);

stack=stack->push2(1);

while(NULL!=stack){

stack=stack->pop2();

}

system("pause");

}

效果图

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值