/*
雙指針 不帶頭結點的鏈棧
VS2010 調試
*/
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#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;
}
雙指針不帶頭結點的鏈棧的實現(C語言)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.