배열 과 링크 로 스 택 을 구축 하 다.

3450 단어 데이터 구조
스 택, 링크 로 구축 할 때 두 가지 기본 적 인 struct 를 구축 해 야 합 니 다. 하 나 는 Stack struct 는 스 택 지붕 노드 와 스 택 크기 를 포함 합 니 다.하 나 는 Stack node 입 니 다. 데이터 와 다음 노드 지침 을 포함 합 니 다.
스 택, 배열 로 구축 할 때 하나의 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

두 가지 방법 모두 메모리 의 분배 와 방출 에 주의해 야 한다!

좋은 웹페이지 즐겨찾기