linkstack.c
#include "linkstack.h"
int InitStack(Stack *s)
{
if (NULL == s)
{
return FAILURE;
}
s->top = NULL;
s->length = 0; //表示空栈
return SUCCESS;
}
int push(Stack *s, int num)
{
if (NULL == s)
{
return FAILURE;
}
Node *n = (Node *)malloc(sizeof(Node) * 1);
if (NULL == n)
{
return FAILURE;
}
n->data = num;
n->next = s->top;
s->top = n; //更新栈顶指针
s->length++;
return SUCCESS;
}
int GetTop(Stack *s)
{
if (NULL == s)
{
return FAILURE;
}
if(s->top == NULL)
{
return FAILURE;
}
return s->top->data;
}
int pop(Stack *s)
{
if (NULL == s)
{
return FAILURE;
}
if (s->top == NULL) //空栈不能出栈
{
return FAILURE;
}
Node *n = s->top;
int data = n->data;
s->top = n->next;
free(n);
s->length--;
return data;
}
int EmptyStack(Stack *s)
{
if (NULL == s)
{
return FAILURE;
}
return (s->top == NULL) ? SUCCESS : FAILURE;
}
int ClearStack(Stack *s)
{
if (NULL == s)
{
return FAILURE;
}
Node *n = s->top;
while (n)
{
s->top = n->next;
free(n);
n = s->top;
s->length--;
}
return SUCCESS;
}
linkstack.h
#ifndef LINKSTACK_H
#define LINKSTACK_H
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SUCCESS 1000
#define FAILURE 1001
struct Node //表示结点的信息
{
int data;
struct Node *next;
};
typedef struct Node Node;
struct Stack //表示栈的信息
{
Node *top;
int length;
};
typedef struct Stack Stack;
int InitStack(Stack *s);
int push(Stack *s, int num);
int GetTop(Stack *s);
int pop(Stack *s);
int EmptyStack(Stack *s);
int ClearStack(Stack *s);
#endif
main.c
#include "linkstack.h"
int main()
{
Stack stack; //定义栈
int ret = InitStack(&stack);
if (SUCCESS == ret)
{
printf("初始化栈成功!\n");
}
else
{
printf("初始化栈失败!\n");
}
int i, num;
srand(time(NULL));
for (i = 0; i < 10; i++)
{
num = rand() % 20;
ret = push(&stack, num);
if (SUCCESS == ret)
{
printf("%d进栈成功!\n", num);
}
else
{
printf("%d进栈失败!\n", num);
}
}
ret = GetTop(&stack);
if (FAILURE == ret)
{
printf("栈顶元素不存在\n");
}
else
{
printf("栈顶元素是%d\n", ret);
}
for (i = 0; i < 5; i++)
{
ret = pop(&stack);
if (FAILURE == ret)
{
printf("出栈失败\n");
}
else
{
printf("%d出栈成功!\n", ret);
}
}
ret = EmptyStack(&stack);
if (SUCCESS == ret)
{
printf("栈为空!\n");
}
else
{
printf("栈不为空!\n");
}
ret = ClearStack(&stack);
if (SUCCESS == ret)
{
printf("栈清空成功!\n");
}
else
{
printf("栈清空失败!\n");
}
for (i = 0; i < 5; i++)
{
ret = pop(&stack);
if (FAILURE == ret)
{
printf("出栈失败\n");
}
else
{
printf("%d出栈成功!\n", ret);
}
}
return 0;
}