在数据结构中,什么是栈?
模拟实现一个栈?
#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;
};