배열 과 링크 로 스 택 을 구축 하 다.
3450 단어 데이터 구조
스 택, 배열 로 구축 할 때 하나의 struct 만 필요 합 니 다. 하나의 배열 과 스 택 크기 를 포함 합 니 다.
링크 원본 코드 는 다음 과 같 습 니 다.
4. 567913. 배열 소스 코드 는 다음 과 같다.
#if 0
#include "stdlib.h"
#include "stdio.h"
typedef int item;
typedef struct node * pnode;
typedef struct node
{
item data;
pnode dowm;
}Node;
typedef struct stack
{
pnode top;
int size;
}Stack;
Stack * initStack(); // , 0, NULL
void DestoryStack(Stack **ps); //
void CleraStack(Stack * ps); //
int IsEmpty(Stack * ps); // , 1, 0
int GetStackSize(Stack * ps); //
pnode GetStackTop(Stack * ps,item * pitem);// , pitem null,*pitem data
pnode Push(Stack * ps,item tem); // tem ,
pnode Pop(Stack * ps,int * d); // , d null ,*d data
void Traversal(Stack *ps , void (*visit)());
void print( int a);
Stack * initStack()
{
Stack * ps = (Stack *)malloc(sizeof(Stack));
if ( ps !=NULL)
{
ps->top = NULL;
ps->size = 0;
}
else
printf("error");
return ps;
}
void DestoryStack(Stack **ps)
{
if (IsEmpty(*ps) != 1)
{
CleraStack(*ps);
}
else
{
*ps = NULL;
free(*ps);
}
}
void CleraStack(Stack * ps)
{
while( IsEmpty(ps) != 1)
{
Pop(ps,NULL);
}
}
int IsEmpty(Stack * ps)
{
if ( ps ->size == 0 && ps ->top == NULL)
{
return 1;
}
else
return 0;
}
int GetStackSize(Stack * ps)
{
return ps ->size;
}
pnode GetStackTop(Stack * ps,item * pitem)
{
if ( IsEmpty(ps) != 1 && pitem != NULL)
{
*pitem = ps ->top->data;
}
return ps->top;
}
pnode Push(Stack * ps,item tem)
{
pnode pp = (pnode)malloc(sizeof(Node));
if ( pp != NULL)
{
pp ->data = tem;
pp ->dowm = GetStackTop(ps,NULL);
(ps->size)++;
ps->top = pp;
}
return pp;
}
pnode Pop(Stack * ps,int * d)
{
pnode p = ps ->top;
if ( IsEmpty(ps) != 1 && p != NULL)
{
if ( d != NULL)
{
*d = p->data;
}
ps ->size--;
ps ->top = p->dowm;
free(p);
}
return ps ->top;
}
void Traversal(Stack *ps , void (*visit)())
{
pnode p;
int sum ;
if (!ps)
{
printf("destory");
return;
}
if (IsEmpty(ps) )
{
printf("stack is null ");
return;
}
else
{
p= ps ->top;
sum = ps ->size;
while(sum--)
{
visit(p->data);
p = p->dowm;
}
}
return;
}
void print( int a)
{
printf(" %d ",a);
}
main()
{
int i,tmp,size;
Stack * s;
s = initStack(s);
for( i = 0; i<10; i++)
{
Push(s,i);
GetStackTop(s,&tmp);
printf(" top = %d ",tmp);
size = GetStackSize(s);
printf(" size = %d
",size);
}
printf("
");
for( i = 0; i<10; i++)
{
Pop(s,&tmp);
printf(" %d ",tmp);
}
printf("
");
size = GetStackSize(s);
printf(" size = %d
",size);
for( i = 0; i<10; i++)
{
Push(s,i);
GetStackTop(s,&tmp);
printf(" top = %d ",tmp);
size = GetStackSize(s);
printf(" size = %d
",size);
}
printf("
");
Traversal(s , print);
printf("
");
CleraStack(s);
Traversal(s , print);
printf("
");
DestoryStack(&s);
Traversal(s , print);
while(1);
}
#endif
두 가지 방법 모두 메모리 의 분배 와 방출 에 주의해 야 한다!