数据结构之栈的概念,应用,最小栈

在数据结构中,什么是栈?

模拟实现一个栈?
#pragma once
//#inclue<stdint.h>
#include<stddef.h>
typedef size_t SeqStackType;
#define SEQ_STACK_SIZE 100
typedef struct SeqStck
{//栈:后进先出
	SeqStackType data[SEQ_STACK_SIZE];
	size_t size;
}SeqStack;
void SeqStackInit(SeqStack *stack);
void SeqStackDestory(SeqStack* stack);
void SeqStackPush(SeqStack* stack, SeqStackType value);
void SeqStackPop(SeqStack *stack);
int SeqStackTop(SeqStack* stack, SeqStackType* value);

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<Windows.h>
#include"seqstack.h"
void SeqStackInit(SeqStack *stack)
{
	if (stack == NULL)
	{
		return;
	}
	stack->size = 0;
}
void SeqStackDestory(SeqStack* stack)
{
	if (stack == NULL)
	{
		return;
	}
	stack->size = 0;
}
void SeqStackPush(SeqStack* stack, SeqStackType value)
{
	if (stack == NULL)
	{
		//stack->data[stack->size++] = value;
		return;
	}
	if (stack->size >= SEQ_STACK_SIZE)
	{
		return;
	}
	stack->data[stack->size++] = value;
	
}
void SeqStackPop(SeqStack *stack)
{
	if (stack == NULL)
	{
		return;
	}
	if (stack->size ==0)
	{
		return;
	}
	else
	{
		stack->data[stack->size--] = 0;
	}
}
int  SeqStackTop(SeqStack* stack, SeqStackType* value)
{
	if (stack == NULL||value==NULL)
	{
		return 0;
	}
	if (stack->size == 0)
	{
		return 0;
	}
	*value = stack->data[stack->size-1];
	return 1;
}
#if 0
void SeqStackPrintfChar(SeqStack *stack, const char* msg)
{
	size_t i = 0;
	printf("*++++++++*++++++++*++++++++*++++++++*++++++++*++++++++*\n");
	if (stack == NULL)
	{
		printf("stack is NULL");
		return;
	}
	printf("栈底[%s]:", msg);
	SeqStack*cur = stack;
	for (; i<cur->size; ++i)
	{
		printf("[%c]->", cur->data[i]);
	}
	printf("[栈顶]");
	printf("\n");

}
void test()
{
	SeqStack stack;
	SeqStackType  p;
	SeqStackType *stack1 = "abc";
	SeqStackInit(&stack);
	SeqStackPush(&stack, 'a');
	SeqStackPush(&stack, 'b');
	SeqStackPush(&stack, 'c');
	SeqStackPush(&stack, 'd');
	SeqStackPush(&stack, 'e');
	SeqStackPrintfChar(&stack, "abcde");
	SeqStackPop(&stack);
	SeqStackPrintfChar(&stack, "abcd");
	SeqStackTop(&stack,&p);
	printf("%c\n", p);
}
int main()
{
	test();
	system("pause");
	return 0;
}
#endif

系统库中的栈.

栈的常见题之最小栈

错解:实现一个最小栈

1.创建一个整型变量 min,用来指示最小值的位置

例如:入栈一组数据3 5 9 2 7 4 1

2.当第一个元素入栈,让min=0,唯一的元素就是最小值。

min先标记0位置的元素3

3.当之后的新元素依次入栈,让新元素和min指向位置的元素比较大小。

如果min当前指向的元素>入栈元素,min不变.

否则min保存新元素位置.

如图:依次对比,当2入栈时,min=3,当1入栈时min=6.

4.当需要使用最小值时,直接返回min所指向位置的元素即可。


但是,这样实现会有一个问题,当取出最小元素后,例如将min=6位置的1取出后,无法判定新的最小元素是谁.


图中:min无法退回到元素2所指向的位置,数值已经被覆盖.

因此最好有一个新的栈来同步保存每一次入栈或者出栈后新的最小元素是谁.


实现最小栈:定义一个普通栈保存原来的栈数据,定义一个最小栈来保存当前最小的数据

分别取出最小栈的值和当前栈的值,最小栈为空或者最小栈的值大于当前值,就将新的最小值压入栈顶.
否则就将最小栈的值再存入当前栈顶

class Solution {
public:
	//后进先出
	void push(int value) {
		scom.push(value);
		if (smin.empty() || value<smin.top())
		{
			smin.push(value);
		}
		else
		{
			smin.push(smin.top());
		}
	}
	//pop需要依次弹出两个栈的值进行对比
	void pop() {
		smin.pop();
		scom.pop();
	}
	//top是为了查看原有栈的元素
	int top() {
		return scom.top();
	}
	//此处查看栈的最小值
	int min() {
		return smin.top();
	}
private:
	stack<int> scom;//common stack;
	stack<int> smin;//min stack;
};


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值