#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#define ERROR 0
#define OK 1
typedef struct Node
{
int data;
struct Node *next;
}Node;
typedef struct LinkStack
{
Node *top;
int count;
}LinkStack;
int push(LinkStack *stack, int value)
{
assert(stack);
Node *node = (Node *)malloc(sizeof(Node));
node->data = value;
node->next = stack->top;
stack->count++;
stack->top = node;
return OK;
}
int pop(LinkStack *stack, int *value)
{
assert(stack);
if (stack->count <= 0)
{
printf("stack empty\n");
return ERROR;
}
Node *p = stack->top;
*value = p->data;
stack->top = p->next;
stack->count--;
free(p);
return OK;
}
void dump(LinkStack *stack)
{
Node *p = stack->top;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main()
{
LinkStack *stack = (LinkStack *)malloc(sizeof(LinkStack));
stack->top = NULL;
stack->count = 0;
int ret = push(stack, 1);
ret = push(stack, 2);
ret = push(stack, 3);
ret = push(stack, 4);
ret = push(stack, 5);
ret = push(stack, 6);
dump(stack);
pop(stack, &ret);
dump(stack);
pop(stack, &ret);
dump(stack);
pop(stack, &ret);
dump(stack);
pop(stack, &ret);
dump(stack);
pop(stack, &ret);
dump(stack);
pop(stack, &ret);
dump(stack);
return 0;
}
顺序栈和链栈 push和pop操作都很简单,没有任何循环,时间复杂度都是o(1)
顺序栈 预分配固定长度的空间,容易浪费,随机存取方便
链栈 没有长度限制,但是每个节点都有指针,增加了内存开销。。。。。。
如果栈里边元素不可预测,那就用链栈,动态扩充长度,反之就是顺序栈。。。。。