栈的顺序为先进后出。栈可以右多种出具结构来表达。
第一种:顺序栈,开辟一片连续的区域存储数据:例如静态数组或者动态数组。数组的尾部进行出栈进展的操作。
数据结构为
Struct stack{
int size;
int data[maxsize];
}
可以进行的操作.Create push pop top, getsize, free and getMin.
缺点:如果要GetMin的话需要每次都遍历一次,效率比较低。第二,数据长度固定,不可变,会浪费空间,不够灵活。
第二种:链式栈:开辟一片不连续的空间,用链表的方式给串在一起。对战的头部进行出栈或者入栈的操作。
数据结构比上一种要稍微复杂
第一步先定义每个节点的结构
struct node{
int data;
int min/Max;
struct node * next.
}LNode;
第二部定义链表的数据结构
struct stack{
int size;
LNode* next
} LStack
可以进行的操作.Create push pop top, getsize, free and getMin.
入栈的时候需要把Minvalue 同时入栈,getSize可以直接利用。效率可以提高
缺点:出栈要Free 释放的节点,避免内存泄漏
源代码:
typedef struct node
{
int data;
int min;
struct node* next;
}LNode;
//define link table structure
typedef struct MinStack
{
int size;
LNode* next;
}MinStack;
//create stack
MinStack* minStackCreate()
{
MinStack* initstack = (MinStack*)malloc(sizeof(MinStack));
initstack->size = 0;
initstack->next = NULL;
return initstack;
}
void minStackPush(MinStack* obj, int val) {
if (obj == NULL) return;
// create a node;
LNode* newnode = (LNode*)malloc(sizeof(LNode));
// set new node value
newnode->data = val;
// set up min value
if (obj->next == NULL)
{
newnode->min = val;
}
else
{
newnode->min = val < obj->next->min ? val : obj->next->min;
}
newnode->next = obj->next;
obj->next = newnode;
obj->size++;
}
void minStackPop(MinStack* obj) {
if (obj == NULL || obj->next ==NULL) return;
// Define node variable;
LNode* newnode = obj->next;
obj->next = newnode->next;
obj->size--;
free(newnode);
newnode = NULL;
}
int minStackTop(MinStack* obj) {
return obj->next->data;
}
int minStackGetMin(MinStack* obj) {
return obj->next->min;
}
void minStackFree(MinStack* obj) {
if (obj == NULL) return;
free(obj);
}
int main()
{
MinStack* mystack = minStackCreate();
//minstack* mystack = minstackcreate();
minStackPush(mystack, -2);
minStackPush(mystack, -8);
LNode* ptr = mystack->next;
while (ptr != NULL)
{
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n ");
minStackPush(mystack, -1);
minStackPush(mystack, 0);
minStackPush(mystack, -3);
ptr = mystack->next;
while (ptr != NULL)
{
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n ");
int ret = minStackGetMin(mystack);
printf("min value = %d \n ", ret);
//
minStackPop(mystack);
ptr = mystack->next;
while (ptr != NULL)
{
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n ");
minStackPop(mystack);
ptr = mystack->next;
while (ptr != NULL)
{
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n ");
minStackPush(mystack, -4);
minStackPush(mystack, -7);
minStackPush(mystack, 9);
minStackPush(mystack, -15);
ptr = mystack->next;
while (ptr != NULL)
{
printf("%d ", ptr->data);
ptr = ptr->next;
}
printf("\n ");
int stacktopvalue = minStackTop(mystack);
printf("top value = %d \n ", stacktopvalue);
ret = minStackGetMin(mystack);
printf("min value = %d \n ", ret);
minStackPop(mystack);
ret = minStackGetMin(mystack);
printf("min value = %d \n ", ret);
printf("test =%s\n", "test");
}