利用C语言链表实现栈的基本功能:
//LinkStack.h
#ifndef _LINKSTACK_H
#define _LINKSTACK_H
#include <stdio.h>
#include <stdlib.h>
#define SUCCESS 10000
#define FAILURE 10001
#define TRUE 10002
#define FALSE 10003
typedef int Elemtype;
typedef struct node
{
Elemtype data;
struct node *next;
}Node;
typedef struct stack
{
struct node *top;
int count;
}Stack;
int StackInit(Stack **stack);
int StackEmpty(Stack *stack);
int Push(Stack **stack, Elemtype e);
int GetTop(Stack *stack);
int Pop(Stack **stack);
int StackClear(Stack **stack);
int StackDestory(Stack **stack);
#endif
//LinkStack.c
#include "LinkStack.h"
int StackInit(Stack **stack)
{
if(NULL == stack)
{
return FAILURE;
}
*stack = (Stack *)malloc(sizeof(Stack)*1);
if(NULL == *stack)
{
return FAILURE;
}
(*stack)->top = NULL;
(*stack)->count = 0;
return SUCCESS;
}
int StackEmpty(Stack *stack)
{
if(NULL == stack)
{
return FAILURE;
}
return (stack->top == NULL) ? TRUE : FALSE;
}
int Push(Stack **stack, Elemtype e)
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p;
p = (Node *)malloc(sizeof(Node));
if(NULL == p)
{
return FAILURE;
}
p->data = e;
p->next = (*stack)->top;
(*stack)->top = p;
(*stack)->count++;
return SUCCESS;
}
int GetTop(Stack *stack)
{
if(NULL == stack)
{
return FAILURE;
}
return stack->top->data;
}
int Pop(Stack **stack)
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p = (*stack)->top;
Elemtype e = (*stack)->top->data;
(*stack)->top = (*stack)->top->next;
(*stack)->count--;
free(p);
p = NULL;
return e;
}
int StackClear(Stack **stack)
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p;
while((*stack)->top != NULL)
{
p = (*stack)->top;
(*stack)->top = (*stack)->top->next;
(*stack)->count--;
free(p);
}
return SUCCESS;
}
int StackDestory(Stack **stack)
{
if(NULL == stack || NULL == *stack)
{
return FAILURE;
}
Node *p;
while((*stack)->top != NULL)
{
p = (*stack)->top;
(*stack)->top = (*stack)->top->next;
(*stack)->count--;
free(p);
}
free(*stack);
*stack = NULL;
return SUCCESS;
}
//Teat.c
#include "LinkStack.h"
int main()
{
Stack *stack;
int ret, i;
ret = StackInit(&stack);
if(SUCCESS == ret)
{
printf("Stack init success!\n");
}
else
{
printf("Stack init failure!\n");
}
ret = StackEmpty(stack);
if(TRUE == ret)
{
printf("Stack is empty.\n");
}
else if(FALSE == ret)
{
printf("Stack isn't empty.\n");
}
else if(FAILURE == ret)
{
printf("ERROR!\n");
}
for(i = 0; i < 10; i++)
{
ret = Push(&stack, i+1);
if(SUCCESS == ret)
{
printf("Stack Push %2d Success.\n", i+1);
}
else
{
printf("Stack Push Failure.\n");
}
}
ret = GetTop(stack);
if(FAILURE == ret)
{
printf("GetTop FAILURE.\n");
}
else
{
printf("Top is %d.\n", ret);
}
for(i = 0; i < 5; i++)
{
ret = Pop(&stack);
if(FAILURE == ret)
{
printf("Stack Pop Failure.\n");
}
else
{
printf("Stack Pop %2d Success.\n", ret);
}
}
ret = GetTop(stack);
if(FAILURE == ret)
{
printf("GetTop FAILURE.\n");
}
else
{
printf("Top is %d.\n", ret);
}
ret = StackClear(&stack);
if(FAILURE == ret)
{
printf("Stack Clear Failure.\n");
}
else
{
printf("Stack Clear Success.\n");
}
ret = StackDestory(&stack);
if(FAILURE == ret)
{
printf("Stack Destory Failure.\n");
}
else
{
printf("Stack Destory Success.\n");
}
return 0;
}