数据结构-栈的操作

Posted 坏坏-5

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构-栈的操作相关的知识,希望对你有一定的参考价值。


栈的综合程序

主函数

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

/*定义结点*/
typedef struct Node
{
	int data;              //数据域
	struct Node * pNext;   //指针域·
}NODE, * PNODE;

/*定义指向结点的指针*/
typedef struct Stack
{
	PNODE pTop;      //指向栈顶
	PNODE pBottom;   //指向栈底
}Stack, * PStack;

/*函数声明*/
void Init(PStack);        //对栈进行初始化
void Push(PStack, int);   //压栈
void Traverse(PStack);    //遍历栈
bool Empty(PStack);
bool Pop(PStack, int *);  //出栈
void Clear(PStack);       //清空栈中的数据

int main(void)
{
	Stack S;  //定义用来指向栈顶和栈底的指针变量
	int val;  //用于存放出栈元素的值

	Init(&S);       //对栈进行初始化,造出一个空栈
	Push(&S, 1);    //向栈中压入数据
	Push(&S, 2);
	Push(&S, 3);
	Push(&S, 4);
	Push(&S, 5);

	printf("--------遍历栈--------\\n");
	Traverse(&S);   //对栈进行遍历输出
	
	printf("---------出栈---------\\n");
	if(Pop(&S, &val))
		printf("出栈的元素是:%d\\n出栈成功!\\n", val);
	else
		printf("出栈失败!\\n");

	printf("--------出栈后--------\\n");
	Traverse(&S);

	printf("清空栈\\n");
	Clear(&S);

	printf("--------遍历栈--------\\n");
	if(Empty(&S))
		printf("栈为空!\\n");
	else
		Traverse(&S);

	return 0;
}

对栈的初始化函数

/*对栈的初始化函数*/
void Init(PStack pS)
{
	/*动态分配一个结点指针,用于指向头结点*/
	pS->pTop = (PNODE)malloc(sizeof(NODE));

	/*判断动态内存是否分配成功*/
	if (NULL == pS->pTop)
	{
		printf("内存分配失败!\\n");
		exit(-1);
	}
	else
	{
		/*当栈为空时,pTop和pBottom都指向同一个结点*/
		pS->pBottom = pS->pTop;
		/*将头指针中的指针域清空*/
		pS->pTop->pNext = NULL;
	}
}

对栈的初始化

压栈函数

/*压栈函数*/
void Push(PStack pS, int val)
{
	/*动态分配一个指向新临时结点的指针*/
	PNODE pNew = (PNODE)malloc(sizeof(NODE));

	/*
		将用户输入的数据赋值给pNew中的data
		pNew中的pNext指向原本pTop指向的头指针
		重新使pTop指向新的结点
	 */
	pNew->data = val;
	pNew->pNext = pS->pTop;
	pS->pTop = pNew;
}

压栈

对栈的遍历

/*对栈的遍历函数*/
void Traverse(PStack pS)
{
	/*定义一个临时栈指针,指向栈顶*/
	PNODE p = pS->pTop;

	/*
		判断p是否等于pBottom,即p是否指向栈底
		不指向栈底则输出数据,使p指向下一个结点
	*/
	while(p != pS->pBottom)
	{
		printf("%d ", p->data);
		p = p->pNext;
	}

	printf("\\n");

	return;
}

遍历

判断栈是否为空

/*判断栈是否为空*/
bool Empty(PStack pS)
{
	/*pTop等于pBottom则表明栈为空*/
	if(pS->pTop == pS->pBottom)
		return true;
	else
		return false;
}

出栈函数

/*出栈函数*/
bool Pop(PStack pS, int * val)
{
	/*
		把pS指向的栈出栈以此,并把出栈的元素存入
		val形参所指向的变量中,出栈成功返回true,
		出栈失败返回false
	 */
	if(Empty(pS))
		return false;
	else
	{
		/*
			定义一个临时结点指针,指向栈顶。将栈顶中的值
			赋值给val,使pTop指向下一个结点,此结点作为栈顶
			将p指向的原本的栈顶释放,并把p清空
		*/
		PNODE p = pS->pTop;
		*val = p->data;
		pS->pTop = p->pNext;
		free(p);
		p = NULL;
		return true;
	}
}

出栈

清空栈中的数据

/*清空栈中的数据*/
void Clear(PStack pS)
{
	/*先判断栈是否为空,为空则直接结束*/
	if(Empty(pS))
		return;
	else
	{
		/*
			定义结点指针p,指向栈顶
			定义指针q指向栈顶的下一个结点
		*/
		PNODE p = pS->pTop;
		PNODE q = NULL;

		/*判断p是否指向栈底*/
		while(p != pS->pBottom)
		{
			/*
				p指向栈顶,q指向栈顶的下一个结点,
				下一个结点不是栈底,则释放p指向的结点,
				即原有的栈顶。使p等于现有的栈顶,
				即原有的栈顶下一个结点q
			*/
			q = p->pNext;
			free(p);
			p = q;
		}
		pS->pTop = pS->pBottom;  //使栈顶等于栈底
	}
}

完整程序代码

/*
	1.栈的创建
	2.压栈
	3.遍历
	4.出栈
	5.清空栈中的数据
*/
# include <stdio.h>
# include <malloc.h>
# include <stdlib.h>

/*定义结点*/
typedef struct Node
{
	int data;              //数据域
	struct Node * pNext;   //指针域·
}NODE, * PNODE;

/*定义指向结点的指针*/
typedef struct Stack
{
	PNODE pTop;      //指向栈顶
	PNODE pBottom;   //指向栈底
}Stack, * PStack;

/*函数声明*/
void Init(PStack);        //对栈进行初始化
void Push(PStack, int);   //压栈
void Traverse(PStack);    //遍历栈
bool Empty(PStack);
bool Pop(PStack, int *);  //出栈
void Clear(PStack);       //清空栈中的数据

int main(void)
{
	Stack S;  //定义用来指向栈顶和栈底的指针变量
	int val;  //用于存放出栈元素的值

	Init(&S);       //对栈进行初始化,造出一个空栈
	Push(&S, 1);    //向栈中压入数据
	Push(&S, 2);
	Push(&S, 3);
	Push(&S, 4);
	Push(&S, 5);

	printf("--------遍历栈--------\\n");
	Traverse(&S);   //对栈进行遍历输出
	
	printf("---------出栈---------\\n");
	if(Pop(&S, &val))
		printf("出栈的元素是:%d\\n出栈成功!\\n", val);
	else
		printf("出栈失败!\\n");

	printf("--------出栈后--------\\n");
	Traverse(&S);

	printf("清空栈\\n");
	Clear(&S);

	printf("--------遍历栈--------\\n");
	if(Empty(&S))
		printf("栈为空!\\n");
	else
		Traverse(&S);

	return 0;
}

/*对栈的初始化函数*/
void Init(PStack pS)
{
	/*动态分配一个结点指针,用于指向头结点*/
	pS->pTop = (PNODE)malloc(sizeof(NODE));

	/*判断动态内存是否分配成功*/
	if (NULL == pS->pTop)
	{
		printf("内存分配失败!\\n");
		exit(-1);
	}
	else
	{
		/*当栈为空时,pTop和pBottom都指向同一个结点*/
		pS->pBottom = pS->pTop;
		/*将头指针中的指针域清空*/
		pS->pTop->pNext = NULL;
	 	//等价于pS->Bottom->pNext = NULL;
	}
}

/*压栈函数*/
void Push(PStack pS, int val)
{
	/*动态分配一个指向新临时结点的指针*/
	PNODE pNew = (PNODE)malloc(sizeof(NODE));

	/*
		将用户输入的数据赋值给pNew中的data
		pNew中的pNext指向原本pTop指向的头指针
		重新使pTop指向新的结点
	 */
	pNew->data = val;
	pNew->pNext = pS->pTop;
	pS->pTop = pNew;
}


/*对栈的遍历函数*/
void Traverse(PStack pS)
{
	/*定义一个临时栈指针,指向栈顶*/
	PNODE p = pS->pTop;

	/*
		判断p是否等于pBottom,即p是否指向栈底
		不指向栈底则输出数据,使p指向下一个结点
	*/
	while(p != pS->pBottom)
	{
		printf("%d ", p->data);
		p = p->pNext;
	}

	printf("\\n");

	return;
}

/*判断栈是否为空*/
bool Empty(PStack pS)
{
	/*pTop等于pBottom则表明栈为空*/
	if(pS->pTop == pS->pBottom)
		return true;
	else
		return false;
}

/*出栈函数*/
bool Pop(PStack pS, int * val)
{
	/*
		把pS指向的栈出栈以此,并把出栈的元素存入
		val形参所指向的变量中,出栈成功返回true,
		出栈失败返回false
	 */
	if(Empty(pS))
		return false;
	else
	{
		/*
			定义一个临时结点指针,指向栈顶。将栈顶中的值
			赋值给val,使pTop指向下一个结点,此结点作为栈顶
			将p指向的原本的栈顶释放,并把p清空
		*/
		PNODE p = pS->pTop;
		*val = p->data;
		pS->pTop = p->pNext;
		free(p);
		p = NULL;
		return true;
	}
}

/*清空栈中的数据*/
void Clear(PStack pS)
{
	/*先判断栈是否为空,为空则直接结束*/
	if(Empty(pS))
		return;
	else
	{
		/*
			定义结点指针p,指向栈顶
			定义指针q指向栈顶的下一个结点
		*/
		PNODE p = pS->pTop;
		PNODE q = NULL;

		/*判断p是否指向栈底*/
		while(p != pS->pBottom)
		{
			/*
				p指向栈顶,q指向栈顶的下一个结点,
				下一个结点不是栈底,则释放p指向的结点,
				即原有的栈顶。使p等于现有的栈顶,
				即原有的栈顶下一个结点q
			*/
			q = p->pNext;
			free(p);
			p = q;
		}
		pS->pTop = pS->pBottom;  //使栈顶等于栈底
	}
}
/*运行结果*/
--------遍历栈--------
5 4 3 2 1
---------出栈---------
出栈的元素是:5
出栈成功!
--------出栈后--------
4 3 2 1
清空栈
--------遍历栈--------
栈为空!
Press any key to continue . . .

以上内容均属原创,如有不详或错误,敬请指出。

以上是关于数据结构-栈的操作的主要内容,如果未能解决你的问题,请参考以下文章

栈的顺序存储结构及应用(CJava代码)

数据结构-栈的操作

数据结构基础学习——栈的概念及代码实现

栈的代码实现之数组方案

Android Studio - 带回栈的导航抽屉

数据结构&算法08-栈概念&源码