1. 程式人生 > >【資料結構】C語言最基礎練習:棧的初始化,壓棧,出棧,遍歷,清空

【資料結構】C語言最基礎練習:棧的初始化,壓棧,出棧,遍歷,清空

隨手練習一下,詳細程式碼解釋都在程式碼片裡請仔細看看 如果有什麼不對的地方,請在下方留言 先建立標頭檔案:

#define _CRT_SECURE_NO_WARNINGS 1
#ifndef _TEST_H
#define _TEST_H
//棧的鏈式儲存結構;
typedef struct Node  //建立一種型別的節點;
{
	int data;
	struct Node * pnext;
}NODE, *PNODE;
typedef struct Stack  //建立一個棧型別,裡面含有兩個指標,一個指向棧頂,一個指向棧底
{
	PNODE ptop;
	PNODE pBottom;
}STACK, *PSTACK;

void init(PSTACK ps);//初始化棧
void push(PSTACK ps, int val);//壓棧
void traverse(PSTACK ps);//遍歷棧
bool empty(PSTACK ps);//判斷棧是否為空
bool pop(PSTACK ps, int * pval);//出棧
void clear(PSTACK ps);//清空棧
#endif  //_TEST_H
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <stdbool.h>
#include "test.h"
int main()
{
	//int val;//儲存出棧的元素
	STACK S;//定義一個棧變數
	init(&S);//初始化這個棧
	push(&S, 1);//壓棧
	push(&S, 2);
	push(&S, 3);
	push(&S, 4);
	push(&S, 5);
	push(&S, 6);
	traverse(&S);//遍歷
	/*if (pop(&S, &val))//出棧
	{
		printf("出棧成功!出棧元素為%d \n", val);
		printf("-------------------------------------------------------\n");
	}
	else
	{
		printf("出棧失敗!\n");
	}*/
	//traverse(&S);
	clear(&S);//清空
	printf("-------------------------------------------------------\n");
	printf("清空後棧中元素為:");
	printf("棧中元素為:\n");
	traverse(&S);
	//free(S);//銷燬棧
	system("pause");
	return 0;
}
void init(PSTACK ps)
{
	ps->ptop = (PNODE)malloc(sizeof(NODE));//建立一個空棧
	if (NULL == ps->ptop)
	{
		printf("success\n");
		exit(-1);
	}
	else
	{
		ps->pBottom = ps->ptop;//棧底指標跟棧頂指標都指向這個新建的空節點
		ps->ptop->pnext = NULL;
	}
}
void push(PSTACK ps, int val)//壓棧
{
	PNODE pNew = (PNODE)malloc(sizeof(NODE));//新建一個節點
	pNew->data = val;//新節點資料域等於val
	pNew->pnext = ps->ptop;//新節點指標域指向棧頂指標所指向的節點,就是前面棧底跟棧頂同時指向的空節點,這樣就實現壓棧了
	ps->ptop = pNew;//然後棧頂元素上移,始終指向就是最後入棧的節點
}
void traverse(PSTACK ps)//遍歷
{
	PNODE p = ps->ptop;//遍歷是從棧頂依次輸出,所以建立一個指標,指向棧頂指標所指向的節點
	while (p!=ps->pBottom)//當p所指向的節點不是棧底指標指向的節點時
	{
		printf("%d\n", p->data);//輸出p所指向的節點的資料域的值
		p = p->pnext;//然後指標p重新指向下一個節點
	}
}
//bool pop(PSTACK ps, int * pval)//出棧一個元素
//{
//	if (empty(ps))//先判斷棧是否為空
//	{
//		return false;
//	}
//	else//不為空時
//	{
//		PNODE r = ps->ptop;//建立一個新的指標r,指向棧頂指標所指向的節點
//		*pval = r->data;//將該節點的資料域賦值給val
//		ps->ptop = r->pnext;//棧頂指標重新指向r所指向的下一個節點,
//		free(r);//釋放r所指向的節點,就是剛才的棧頂節點
//		r = NULL;//清空
//		return true;
//	}
//}
bool empty(PSTACK ps)//判斷棧是否為空
{
	if (ps->ptop == ps->pBottom)
		return true;
	else
		return false;
}
void clear(PSTACK ps)//清空棧內元素
{
	if (empty(ps))
	{
		return ;
	}
	else
	{
		PNODE p = ps->ptop;//建立一個指標,指向當前棧頂指標指向的節點
		PNODE q = NULL;//建立一箇中間指標
		while (p!=ps->pBottom)//當p所指向的節點不是棧底指標所指向的節點時
		{
			q = p->pnext;//先將p所指向的下一個節點賦給q
			free(p);//然後刪除該節點
			p = q;//然後將q指向的節點賦給p,也就是p重新指向了p的下一個節點
		}
		ps->ptop = ps->pBottom;//迴圈完了之後,棧底指標跟棧底指標指向同一個節點
	}
}