C语言链栈的基本操作(Clean)

1.初始化.
2.入栈.
3.出栈.
4.取栈顶元素.
5.栈的遍历及输出.

注:
1.链栈不需要设置头结点,由于链栈的插入和删除元素都在只能在栈顶 操作。
2.栈分外部结构内部结构,外部结构是指栈顶指针top;内部结构是指栈的结点环环相扣,链栈的内部结构类似于单链表但,next的指向方向不同,链栈是由栈顶指向栈底,即从后往前指,而单链表是从前往后指,注意区别!

3. 在链栈出栈操作中,需注意要存放出栈元素,须先在主函数定义一个dataType类型的变量elem(注意是“ 变量 ”而不是 “ 指针变量 ”),然后调用出栈函数时将elem的地址传给形参,即pop_out(&s,&elem),通过变量地址传入函数间接访问的方式,才能成功的用elem存取出栈元素的值。
4. 我好啰嗦。

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

typedef int dataType; /*存放整型变量的栈定义dataType类型为int,
                       若存放其他类型的栈可直接修改此处,
                      将int类型替换成其他类型即可*/

typedef struct node  /*栈的内部结构,即栈的结点*/
{
	dataType data;
	struct node *next;
	
}StackNode;

typedef struct stack /*栈的外部结构*/
{
	StackNode *top; /*栈顶指针*/
	int length;    /*栈的结点数(元素个数)*/
}LinkStack;

int initialize(LinkStack *s) /*1.栈的初始化*/
{
	s->top=NULL;  /*栈顶指针置空*/
	s->length=0; /*栈顶元素初始值为0,结点数也为0*/
}

int push_in(LinkStack *s,dataType value) /*2.入栈,链栈与顺序栈不同,链栈入栈不需要判断栈满*/
{
	StackNode *p;
	
	p=(StackNode *)malloc(sizeof(StackNode)); 
	p->data=value;
	
	p->next=s->top;
	s->top=p;
	s->length++;
	
	return;
}

int pop_out(LinkStack *s,dataType *value) /*3.出栈,需判断栈是否为空*/
{
	StackNode *p;
	
	if(s->length==0)
	{
		printf("LinkStack is Empty!\n");
		return;
	}
	p=s->top;
	*value=s->top->data; /*此步操作是用于存放出栈的元素,注意事项见注释3*/
	s->top=p->next;
	s->length--;
	printf("Pop Element is %d. \n",*value);
	return;
	
}

dataType getTop(LinkStack *s)
{
	if(s->length==0)
	{
		printf("LinkStack is Empty!\n");
		return;
	}
	return(s->top->data);
}

void traverse(LinkStack *s) /*4.栈的遍历及输出*/
{
	StackNode *p; 
	int i;
	
	if(s->length==0) 
	{
		printf("LinkStack is Empty!\n");
		return;
	}
	p=s->top;
	printf("The elements in the stack are: ");
	for(i=0;i<s->length;i++)
	{
		printf("%d -> ",p->data);  /*从栈顶指向栈底部 */
		p=p->next;
	}
	printf("Stack Base\n");
	return;
}

int main()
{
	LinkStack s;
	dataType elem;
	return 0;
}

在这里插入图片描述

发布了7 篇原创文章 · 获赞 7 · 访问量 246

猜你喜欢

转载自blog.csdn.net/Attract1206/article/details/105352666
今日推荐