栈的顺序为先进后出。栈可以右多种出具结构来表达。
第一种:顺序栈,开辟一片连续的区域存储数据:例如静态数组或者动态数组。数组的尾部进行出栈进展的操作。
数据结构为
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