标签:obj int 体与栈 next printf mystack ptr 结构
栈的顺序为先进后出。栈可以右多种出具结构来表达。
第一种:顺序栈,开辟一片连续的区域存储数据:例如静态数组或者动态数组。数组的尾部进行出栈进展的操作。
数据结构为
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");
}
标签:obj,int,体与栈,next,printf,mystack,ptr,结构 来源: https://blog.csdn.net/u013744104/article/details/120797295
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。