#include <stdio.h>
#include <malloc.h>
/**************************************
struct Stack * s = newLinkedStack();
s->push(s,5);
s->push(s,6);
printf("%d\n",s->pop(s));
printf("%d\n",s->pop(s));
***************************************/
struct StackNode
{
int data;
struct StackNode* preNode;
};
typedef struct StackType
{
struct StackNode* top;
void (*push) (struct StackType* self, int data);
int (*pop) (struct StackType* self);
void (*clear) (struct StackType* self);
}Stack;
void pushStack(struct StackType* self, int data);
int popStack(struct StackType* self);
struct StackType* newLinkedStack();
struct StackNode* newStackNode();
void clearStack(struct StackType* self);
struct StackType* newLinkedStack()
{
struct StackType
* stack
= (struct StackType
*)malloc(sizeof(struct StackType
));
stack->push = pushStack;
stack->pop = popStack;
stack->clear = clearStack;
stack->top = NULL;
return stack;
}
struct StackNode* newStackNode()
{
struct StackNode
* stackNode
= (struct StackNode
*) malloc( sizeof(struct StackNode
) ); stackNode->preNode = NULL;
return stackNode;
}
void pushStack(struct StackType* self, int data)
{
struct StackNode* stackNode = newStackNode();
stackNode->data = data;
if(self->top == NULL)
self->top = stackNode;
else
{
stackNode->preNode = self->top;
self->top = stackNode;
}
}
int popStack(struct StackType* self)
{
int retn = self->top->data;
void* temp = self->top;
self->top = self->top->preNode;
return retn;
}
int isEmptyStack(struct StackType* self)
{
if(self->top == NULL)
{
return 1;
}
else return 0;
}
void clearStack(struct StackType* self)
{
while(self->top != NULL)
{
self->pop(self);
}
}
void deleteLinkedStack(struct StackType* s)
{
s->clear(s);
}
int main(void)
{
Stack* s = newLinkedStack();
s->push(s,5);
s->push(s,6);
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCnN0cnVjdCBTdGFjayAqIHMgPSBuZXdMaW5rZWRTdGFjaygpOwpzLT5wdXNoKHMsNSk7CnMtPnB1c2gocyw2KTsKcHJpbnRmKCIlZFxuIixzLT5wb3AocykpOwpwcmludGYoIiVkXG4iLHMtPnBvcChzKSk7CioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8Kc3RydWN0IFN0YWNrTm9kZQp7CglpbnQgZGF0YTsKCXN0cnVjdCBTdGFja05vZGUqIHByZU5vZGU7Cn07CnR5cGVkZWYgc3RydWN0IFN0YWNrVHlwZQp7CglzdHJ1Y3QgU3RhY2tOb2RlKiB0b3A7Cgl2b2lkICgqcHVzaCkgKHN0cnVjdCBTdGFja1R5cGUqIHNlbGYsIGludCBkYXRhKTsKCWludCAoKnBvcCkgKHN0cnVjdCBTdGFja1R5cGUqIHNlbGYpOwoJdm9pZCAoKmNsZWFyKSAoc3RydWN0IFN0YWNrVHlwZSogc2VsZik7Cn1TdGFjazsKCnZvaWQgcHVzaFN0YWNrKHN0cnVjdCBTdGFja1R5cGUqIHNlbGYsIGludCBkYXRhKTsKaW50IHBvcFN0YWNrKHN0cnVjdCBTdGFja1R5cGUqIHNlbGYpOwpzdHJ1Y3QgU3RhY2tUeXBlKiBuZXdMaW5rZWRTdGFjaygpOwpzdHJ1Y3QgU3RhY2tOb2RlKiBuZXdTdGFja05vZGUoKTsKdm9pZCBjbGVhclN0YWNrKHN0cnVjdCBTdGFja1R5cGUqIHNlbGYpOwoKc3RydWN0IFN0YWNrVHlwZSogbmV3TGlua2VkU3RhY2soKQp7CglzdHJ1Y3QgU3RhY2tUeXBlKiBzdGFjayA9IChzdHJ1Y3QgU3RhY2tUeXBlKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBTdGFja1R5cGUpKTsKCglzdGFjay0+cHVzaCA9IHB1c2hTdGFjazsKCXN0YWNrLT5wb3AgPSBwb3BTdGFjazsKCXN0YWNrLT5jbGVhciA9IGNsZWFyU3RhY2s7CglzdGFjay0+dG9wID0gTlVMTDsKCQoJcmV0dXJuIHN0YWNrOyAKfQpzdHJ1Y3QgU3RhY2tOb2RlKiBuZXdTdGFja05vZGUoKQp7CglzdHJ1Y3QgU3RhY2tOb2RlKiBzdGFja05vZGUgPSAoc3RydWN0IFN0YWNrTm9kZSopIG1hbGxvYyggc2l6ZW9mKHN0cnVjdCBTdGFja05vZGUpICk7CglzdGFja05vZGUtPnByZU5vZGUgPSBOVUxMOwoJcmV0dXJuIHN0YWNrTm9kZTsKfQp2b2lkICBwdXNoU3RhY2soc3RydWN0IFN0YWNrVHlwZSogc2VsZiwgaW50IGRhdGEpCnsKCXN0cnVjdCBTdGFja05vZGUqIHN0YWNrTm9kZSA9IG5ld1N0YWNrTm9kZSgpOwoJc3RhY2tOb2RlLT5kYXRhID0gZGF0YTsKCWlmKHNlbGYtPnRvcCA9PSBOVUxMKQoJCXNlbGYtPnRvcCA9IHN0YWNrTm9kZTsKCWVsc2UKCXsKCQlzdGFja05vZGUtPnByZU5vZGUgPSBzZWxmLT50b3A7CgkJc2VsZi0+dG9wID0gc3RhY2tOb2RlOwoJfQp9IAppbnQgcG9wU3RhY2soc3RydWN0IFN0YWNrVHlwZSogc2VsZikKewoJaW50IHJldG4gPSBzZWxmLT50b3AtPmRhdGE7Cgl2b2lkKiB0ZW1wID0gc2VsZi0+dG9wOwoKCXNlbGYtPnRvcCA9IHNlbGYtPnRvcC0+cHJlTm9kZTsKCQoJZnJlZSh0ZW1wKTsKCXJldHVybiByZXRuOwp9CmludCBpc0VtcHR5U3RhY2soc3RydWN0IFN0YWNrVHlwZSogc2VsZikKewoJaWYoc2VsZi0+dG9wID09IE5VTEwpCgl7CgkJcmV0dXJuIDE7Cgl9CgllbHNlIHJldHVybiAwOwoJCn0Kdm9pZCBjbGVhclN0YWNrKHN0cnVjdCBTdGFja1R5cGUqIHNlbGYpCnsKCXdoaWxlKHNlbGYtPnRvcCAhPSBOVUxMKQoJewoJCXNlbGYtPnBvcChzZWxmKTsKCX0KfQp2b2lkIGRlbGV0ZUxpbmtlZFN0YWNrKHN0cnVjdCBTdGFja1R5cGUqIHMpCnsKCXMtPmNsZWFyKHMpOwoJZnJlZShzKTsKfQppbnQgbWFpbih2b2lkKQp7CglTdGFjayogcyA9IG5ld0xpbmtlZFN0YWNrKCk7CglzLT5wdXNoKHMsNSk7CglzLT5wdXNoKHMsNik7CglwcmludGYoIiVkXG4iLHMtPnBvcChzKSk7CglwcmludGYoIiVkXG4iLHMtPnBvcChzKSk7Cn0=