/*
双指针 不带头结点的链栈
VS2010 调试
*/
#include
#include
#include
#define TRUE 1
#define FALSE 0
#define ERROR -1
#define OK 1
struct Node
{
int data;
struct Node *next;
};
struct LStack
{
struct Node *top;
struct Node *base;
};
//栈初始化
void init_stack(struct LStack *linkStack)
{
linkStack->base = NULL;
linkStack->top = NULL;
}
//判断栈是否为空
int is_stack_empty(struct LStack *linkStack)
{
return ((linkStack->base == NULL) ? TRUE : FALSE);
}
//进栈,数num进栈
int push_stack(struct LStack *linkStack, int num)
{
struct Node *tmp_node = (struct Node *)malloc(sizeof(struct Node));
if(tmp_node == NULL)
{
return ERROR;
}
tmp_node->data = num;
tmp_node->next = NULL;
if(is_stack_empty(linkStack))
{
linkStack->base = tmp_node;
linkStack->top = tmp_node;
}
else
{
tmp_node->next = linkStack->top;
linkStack->top = tmp_node;
}
return OK;
}
//出栈,出栈元素保存在num中
int pop_stack(struct LStack *linkStack, int *num)
{
struct Node *tmp_node = NULL;
if(is_stack_empty(linkStack))
{
return ERROR;
}
*num = linkStack->top->data;
tmp_node = linkStack->top;
linkStack->top = linkStack->top->next;
if(linkStack->top == NULL)
{
linkStack->base = NULL;
}
free(tmp_node);
return OK;
}
//或取栈顶元素,放入num中
int get_head_elem(struct LStack linkStack, int *num)
{
if(is_stack_empty(&linkStack))
{
return ERROR;
}
*num = linkStack.top->data;
return OK;
}
//销毁栈
int destory_stack(struct LStack *linkStack)
{
struct Node *tmp_node = NULL;
if(is_stack_empty(linkStack))
{
return OK;
}
while(linkStack->top != NULL)
{
tmp_node = linkStack->top;
linkStack->top = linkStack->top->next;
free(tmp_node);
}
linkStack->base = NULL;
return OK;
}
//获取栈的长度,将长度返回
int get_stack_length(struct LStack linkStack)
{
int length = 0;
if(is_stack_empty(&linkStack))
{
return 0;
}
while (linkStack.top != NULL)
{
linkStack.top = linkStack.top->next;
length++;
}
return length;
}
//打印栈内的数据元素
void print_stack(struct LStack linkStack)
{
printf("TOP\n");
while(linkStack.top != NULL)
{
printf("%d\n", linkStack.top->data);
linkStack.top = linkStack.top->next;
}
printf("BOTTOM\n\n");
}
int main(int argc, char *argv[])
{
int num = 0;
struct LStack linkStack;
init_stack(&linkStack);
push_stack(&linkStack, 7);
push_stack(&linkStack, 8);
push_stack(&linkStack, 9);
push_stack(&linkStack, 6);
push_stack(&linkStack, 5);
print_stack(linkStack);
pop_stack(&linkStack, &num);
print_stack(linkStack);
get_head_elem(linkStack, &num);
printf("%d,%d\n", get_stack_length(linkStack), num);
destory_stack(&linkStack);
return 0;
}