數據結構學習筆錄--堆棧的實現

和隊列一樣,堆棧也是一個對操作有一定約束的線性表,進棧時只能在一端進行,出棧在另一端進行。就如同一疊盤子,先放的最後拿出來,最後放的最先拿出來,具有先入後出的特徵。下面是堆棧的順序存儲實現和鏈式存儲實現。

1、堆棧的順序存儲實現

(1)數據結構

typedef struct Stack{
	int Data[MAXSIZE];
	int top;
}stack;

(2)一般操作

bool isFull(stack *s); --判斷堆棧是否滿
bool isEmpty(stack *s); --判斷堆棧是否爲空
stack* createStack();  --創建一個堆棧
void Push(stack *s,int elem);  --將元素入棧
int Pop(stack *s);  --出棧


(3)具體實現

bool isFull(stack *s)
{
	if(s->top==MAXSIZE)
		return true;
	else
		return false;
}

bool isEmpty(stack *s)
{
	if(s->top==-1)
		return true;
	else
		return false;
}

stack* createStack()
{
	stack *s;
	s=(stack*)malloc(sizeof(stack));
	s->top=-1;
	return s;
}
void Push(stack *s,int elem)
{
	int i=s->top;
	if(!isFull(s))
	{	
		s->Data[i+1]=elem;
		s->top+=1;
	}
	else
	{
		printf("no enough space to push\n");
	}
}
int Pop(stack *s)
{
	if(isEmpty(s))
	{
		printf("no element in stack");
	}
	else
	{
		int i=s->top;
		s->top-=1;
		return s->Data[i];
	}
	return 0;
}
int main()
{
	stack *s=createStack();
	int i;
	for(i=0;i<10;i++)
	Push(s,i);
	
	for(i=0;i<=s->top;i++)
	printf("data=%d,top=%d\n",s->Data[i],s->top);
	int p;
	while(s->top)
	{
		p=Pop(s);
		printf("pop=%d,top=%d\n",p,s->top);
	}
	return 0;
}

2、堆棧的鏈式存儲

(1)數據結構

typedef struct Node{
	int data;
	struct Node* next;
}stack;

(2)一般操作

bool isEmpty(stack *s); --判斷堆棧是否爲空
stack* createStack();  --創建一個堆棧
void Push(stack *s,int elem);  --將元素入棧
int Pop(stack *s);  --出棧

(3)具體實現

bool isEmpty(stack *s)
{
	if(s->next==NULL)
		return true;
	else
		return false;
}

stack* createStack()
{
	stack *s;
	s=(stack*)malloc(sizeof(stack));
	s->next=NULL;
	return s;
}

void Push(stack *s,int elem)
{
	stack *q;
	q=(stack*)malloc(sizeof(stack));
	q->data=elem;
	q->next=s->next;
	s->next=q;
}
int Pop(stack *s)
{	
	stack *p;
	int i;
	if(!isEmpty(s))
	{
		p=s->next;
		s->next=p->next;
		i=p->data;
		free(p);
		return i;
	}
	else
	{
		printf("the stack is empty\n");
	}
}
int main()
{	
	int i;
	stack *s=createStack();
	printf("進棧順序:\n");
	for(i=0;i<10;i++)
	{
		printf("%d ",i);
		Push(s,i);
	}
	printf("\n出棧順序:\n");	
	for(i=0;i<10;i++)
	{
		int ret=Pop(s);
		printf("%d ",ret);	
	}
		
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章