有关栈方面的知识请参考:>数据结构之栈的基本操作<
方法一
定义两个栈,一个保存栈中元素,一个保存当前栈的最小元素,比较要插入的元素和保存最小元素栈中的栈顶元素,若要插入的元素比保存最小元素的栈要小,就将要插入元素同时插入到两个栈中,即保存最小元素的栈的栈顶元素是最小的。
#include <stdio.h>
#include "seqstack.h"
typedef SeqStackType MinStackType;
//方法一
typedef struct MinStack{
SeqStack data; //保存栈中的元素
SeqStack min; //保存当前栈的最小元素
}MinStack;
void MinStackInit(MinStack* min_stack){
if(min_stack == NULL){
//非法输入
return;
}
SeqStackInit(&min_stack->data);
SeqStackInit(&min_stack->min);
}
void MinStackPush(MinStack* min_stack, MinStackType value){
if(min_stack == NULL){
//非法输入
return;
}
MinStackType tmp;
int ret = SeqStackTop(&min_stack->min, &tmp);
if(ret == 0){
//本来的栈为空
SeqStackPush(&min_stack->data, value);
SeqStackPush(&min_stack->min, value);
return;
}
//本来的栈非空
//先比较要插入元素和 min 栈顶元素大小
MinStackType min = value < tmp ? value : tmp;
SeqStackPush(&min_stack->data, value);
SeqStackPush(&min_stack->min, min);
}
void MinStackPop(MinStack* min_stack){
if(min_stack == NULL){
//非法输入
return;
}
SeqStackPop(&min_stack->data);
SeqStackPop(&min_stack->min);
}
int MinStackMinTop(MinStack* min_stack, MinStackType* value){
if(min_stack == NULL){
//非法输入
return 0;
}
return SeqStackTop(&min_stack->min, value);
}
/////////////////////////////////////////////////////////////////////
//以下为测试代码
/////////////////////////////////////////////////////////////////////
#if 1
void Test(){
MinStack stack;
MinStackInit(&stack);
MinStackPush(&stack, 'b');
MinStackPush(&stack, 'c');
MinStackPush(&stack, 'd');
MinStackPush(&stack, 'a');
MinStackType tmp;
MinStackMinTop(&stack, &tmp);
printf("tmp expect a, actual %c\n", tmp);
MinStackPop(&stack);
MinStackMinTop(&stack, &tmp);
printf("tmp expect b, actual %c\n", tmp);
MinStackPop(&stack);
MinStackMinTop(&stack, &tmp);
printf("tmp expect b, actual %c\n", tmp);
MinStackPop(&stack);
MinStackMinTop(&stack, &tmp);
printf("tmp expect b, actual %c\n", tmp);
}
int main(){
Test();
return 0;
}
#endif
方法二
定义一个栈,当需要进行入栈和出栈操作时,都进行两次。入栈时若是空栈则直接将需要入栈的元素入栈两次,若为非空栈,则比较需入栈元素与栈顶元素的大小,取其中的最小值,第一次入栈需入栈的元素,第二次入栈最小值,这时每次取得栈顶元素都是该栈的最小值。
#include <stdio.h>
#include "seqstack.h"
typedef SeqStackType MinStackType;
//方法二
typedef struct MinStack{
SeqStack data;
}MinStack;
void MinStackInit(MinStack* stack){
if(stack == NULL){
//非法输入
return;
}
SeqStackInit(&stack->data);
}
void MinStackPush(MinStack* stack, MinStackType value){
if(stack == NULL){
//非法输入
return;
}
MinStackType tmp;
int ret = SeqStackTop(&stack->data, &tmp);
if(ret == 0){
SeqStackPush(&stack->data, value);
SeqStackPush(&stack->data, value);
return;
}
MinStackType min = value < tmp ? value : tmp;
SeqStackPush(&stack->data, value);
SeqStackPush(&stack->data, min);
return;
}
void MinStackPop(MinStack* stack){
if(stack == NULL){
//非法输入
return;
}
SeqStackPop(&stack->data);
SeqStackPop(&stack->data);
return;
}
int MinStackMinTop(MinStack* stack, MinStackType* value){
if(stack == NULL){
//非法输入
return 0;
}
return SeqStackTop(&stack->data, value);
}
/////////////////////////////////////////////////////////////////////
//以下为测试代码
/////////////////////////////////////////////////////////////////////
#if 1
void Test(){
MinStack stack;
MinStackInit(&stack);
MinStackPush(&stack, 'b');
MinStackPush(&stack, 'c');
MinStackPush(&stack, 'd');
MinStackPush(&stack, 'a');
MinStackType tmp;
MinStackMinTop(&stack, &tmp);
printf("tmp expect a, actual %c\n", tmp);
MinStackPop(&stack);
MinStackMinTop(&stack, &tmp);
printf("tmp expect b, actual %c\n", tmp);
MinStackPop(&stack);
MinStackMinTop(&stack, &tmp);
printf("tmp expect b, actual %c\n", tmp);
MinStackPop(&stack);
MinStackMinTop(&stack, &tmp);
printf("tmp expect b, actual %c\n", tmp);
}
int main(){
Test();
return 0;
}
#endif

1304

被折叠的 条评论
为什么被折叠?



