基于单链表的栈实现。
栈接口定义:
#ifndef __LINKLIST_STACK_H__
#define __LINKLIST_STACK_H__
#include <stdio.h>
struct unit {
char data;
struct unit* punit;
};
struct linkliststack
{
int size;
struct unit* pstackhead;
char (*pfunpop)(struct linkliststack* pstack);
void (*pfunpush)(struct linkliststack* pstack, char value);
int (*pfunempty)(struct linkliststack* pstack);
void (*pfuntraverse)(struct linkliststack* pstack);
};
char linkliststackpop(struct linkliststack* pstack);
void linkliststackpush(struct linkliststack* pstack, char value);
int linkliststackempty(struct linkliststack* pstack);
void traversestack(struct linkliststack* pstack);
#endif
栈接口实现:
#include "linklist_stack.h"
#include <stdlib.h>
#include <stdio.h>
int linkliststackempty(struct linkliststack * pstack)
{
if(NULL == pstack->pstackhead)
{
return 0;
}
else
{
return 1;
}
}
void linkliststackpush(struct linkliststack* pstack, char value)
{
struct unit * pnew = (struct unit*)malloc(sizeof(struct unit));
if(NULL == pnew)
{
printf("create unit error\n");
return;
}
pnew->data = value;
pnew->punit = pstack->pstackhead;
pstack->pstackhead = pnew;
pstack->size++;
}
char linkliststackpop(struct linkliststack* pstack)
{
if(NULL == pstack || NULL == pstack->pstackhead)
{
printf("empty stack pop error\n");
return -1;
}
struct unit* poldfirst = pstack->pstackhead;
char retval = poldfirst->data;
pstack->pstackhead = pstack->pstackhead->punit;
free(poldfirst);
pstack->size--;
return retval;
}
void traversestack(struct linkliststack* pstack)
{
struct unit* phead = pstack->pstackhead;
while(phead)
{
printf("%c | ", phead->data);
phead = phead->punit;
}
printf("\n");
}
测试程序:
#include "linklist_stack.h"
int main()
{
int i = 0;
char c;
struct linkliststack stack1;
stack1.size = 0;
stack1.pstackhead = NULL;
stack1.pfunpop = linkliststackpop;
stack1.pfunpush = linkliststackpush;
stack1.pfunempty = linkliststackempty;
stack1.pfuntraverse = traversestack;
for(i = 0; i < 100; i++)
{
//scanf("%c", &c);
c = getchar();
if('c' == c)
{
stack1.pfuntraverse(&stack1);
}
else if ('-' != c && '\n' != c)
{
stack1.pfunpush(&stack1, c);
printf("after push, stack size is:%d, input char is:%c\n", stack1.size, c);
}
else if('-' == c)
{
printf("after pop, stack size is:%d, output char is:%c\n", stack1.size, stack1.pfunpop(&stack1));
}
else if('\n' == c)
{
continue;
}
//printf("count i = %d\n", i);
}
printf("test successfully\n");
return 0;
}