#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_STACK_SIZE 10
#define STACK_TRUE 0
#define STACK_FALSE 1
#define STACK_ERROR -1
struct stack {
char *data[MAX_STACK_SIZE];
int top_index;
int (*is_empty)(struct stack *);
int (*is_full)(struct stack *);
char *(*pop)(struct stack *);
int (*push)(struct stack *, const char *);
};
int is_empty(struct stack *mystack)
{
if(NULL == mystack)
return STACK_ERROR;
if(mystack->top_index >= 0)
return STACK_FALSE;
return STACK_TRUE;
}
int is_full(struct stack *mystack)
{
if(NULL == mystack)
return STACK_ERROR;
if(mystack->top_index == (MAX_STACK_SIZE-1))
return STACK_TRUE;
return STACK_FALSE;
}
char * pop(struct stack *mystack)
{
char *item;
if(NULL == mystack)
return NULL;
item = mystack->data[mystack->top_index];
mystack->data[mystack->top_index--] = NULL;
return item;
}
int push(struct stack *mystack, const char *item)
{
char *ele = NULL;
if(NULL == mystack || NULL == item)
return STACK_ERROR;
if(is_full(mystack) == STACK_TRUE)
return STACK_FALSE;
ele = (char *)malloc((strlen(item)+1)*sizeof(char));
strcpy(ele, item);
mystack->data[++mystack->top_index] = ele;
return STACK_TRUE;
}
int main()
{
int i, len = 0;
char *ele;
struct stack mystack = {
.data = {NULL},
.top_index = -1,
.is_empty = is_empty,
.is_full = is_full,
.pop = pop,
.push = push,
};
mystack.push(&mystack, "One");
mystack.push(&mystack, "Two");
mystack.push(&mystack, "Three");
mystack.push(&mystack, "Four");
mystack.push(&mystack, "Five");
mystack.push(&mystack, "Six");
mystack.push(&mystack, "Seven");
mystack.push(&mystack, "Eight");
mystack.push(&mystack, "Nine");
/* pop */
len = mystack.top_index;
for(i = 0; i <= len; i++) {
ele = mystack.pop(&mystack);
printf("%s\n", ele);
free(ele);
}
printf("stack is empty:%d(STACK_TRUE=0)\n", mystack.is_empty(&mystack));
return 0;
}
堆栈 - 采用数组实现 - C语言
最新推荐文章于 2024-07-23 21:59:03 发布