鏈式棧的初體驗

//@author:Archer
//@email:[email protected] || [email protected]
//模仿+練習+改進

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int data;

	struct Node * pNext;

}NODE,*PNODE;

typedef struct stack
{
	int length;

	PNODE pTop;//棧頂

	PNODE pBottom;//棧底

}STACK,*PSTACK;


void init_stack(PSTACK);//生成一個空棧

void push_stack(PSTACK);//壓棧操作

void traverse_stack(PSTACK);//遍歷棧,輸出棧中的元素

void check_malloc(PNODE);//檢查動態內存分配狀況


bool pop_stack(PSTACK);//出棧操作

bool is_empty(PSTACK pstack);//判斷棧是否爲空


int main(void)
{
	STACK stack;

	init_stack(&stack);

	push_stack(&stack);

	traverse_stack(&stack);

	pop_stack(&stack);

	traverse_stack(&stack);


	printf("\n\n");

	system("pause");
	return 0;
}

void init_stack(PSTACK pstack)
{
	pstack->pTop = (PNODE)malloc(sizeof(NODE));

	PNODE p = pstack->pTop;

	check_malloc(p);

	pstack->pBottom = pstack->pTop;

	pstack->pTop->pNext = NULL;
}

void push_stack(PSTACK pstack)
{
	int i =0;

	int value;

	int length = 0;

	printf("請輸入要壓棧的元素個數:");

	scanf("%d",&length);

	pstack->length = length;

	for(i=0;i<length;i++)
	{

		PNODE pNew = (PNODE)malloc(sizeof(NODE));

		check_malloc(pNew);

		printf("\n請輸入第%d個元素:",i+1);

		scanf("%d",&value);

		pNew->data = value;

		pNew->pNext = pstack->pTop;

		pstack->pTop = pNew;

	}

	return;
}

void traverse_stack(PSTACK pstack)
{
	if(is_empty(pstack))
	{
		printf("該棧爲空");

		return;
	}

	int i = pstack->length;

	PNODE p = NULL;

	p = pstack->pTop;

	while(p!=pstack->pBottom)
	{
		printf("\n第%d個元素爲:%d\n",i,p->data);

		p=p->pNext;

		i--;
	}

	return;
}

bool pop_stack(PSTACK pstack)
{
	int count = 0;

	int i;

	PNODE r = NULL;

	if(is_empty(pstack))
	{
		printf("\n該棧爲空\n");

		return false;
	}
	else
	{
		printf("\n請輸入要出棧的元素個數:");

		scanf("%d",&count);

		for(i=count;i>0;i--)
		{
			r = pstack->pTop;

			pstack->pTop= pstack->pTop->pNext;

			free(r);
		}

		return true;
	}
}

void check_malloc(PNODE p)
{
	if(p == NULL)
	{
		printf("\n動態內存分配失敗!\n");

		exit(-1);
	}
}

bool is_empty(PSTACK pstack)
{
	if(pstack->pTop == pstack->pBottom)
	{
		return true;
	}
	else
	{
		return false;
	}
}

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