结构体与栈

栈的顺序为先进后出。栈可以右多种出具结构来表达。
第一种:顺序栈,开辟一片连续的区域存储数据:例如静态数组或者动态数组。数组的尾部进行出栈进展的操作。
数据结构为
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");
}
上一篇:c++模板特化之用deque容器实现stack容器


下一篇:Delphi取UTC时间秒