数据结构——栈

//数据结构--栈
什么是栈:
栈实际上也是线性表的一种,只是他比较特殊,为什么特殊呢?因为他一端是封闭的,不允许进行插入和删除元素操作,另一端是开口
,允许进行插入和删除元素操作。




栈的特点:
栈的特点是先进后出,后进先出。比如:
我拿一个箱子,要往里面放书,先放:
数学书一本
英文书一本
化学书一本
程序设计书一本
现在我要将这些书全部拿出来,顺序就是
数学书
英文书
化学书
程序设计书
从上面的这个例子看到先进后出,后进先出,这个就是一个现实生活中一个栈的抽象例子。





好了,现在理解了什么是栈,那么现在我们开始用C语言来实现栈。
在写代码前我们先来看看栈中的一些名词:
入栈:往栈中插入一个元素,我们称之为入栈运算;
出栈:从栈中删除一个元素,我们称之为出栈运算;


问来又来了,我们进行一系列的插入和删除操作后,我们怎么知道栈,是否还有空间进行插入新元素。和栈是否为空;
这时是不是就得用一个标识来记录呢!就得用一个指向栈顶的变量。这样我们进行插入和删除操作时,就可以通过指向
栈顶的这个指针来判断当前栈的状态了;


变量意思:
//--------------------------------------------
//s 栈存储空间
//m 栈存储空间容量
//top 栈顶指针;
//x   入栈元素
//--------------------------------------------
下面是C语言代码实现:
//建立空栈:


	#include <stdio.h>
	void main()
	{
		int m, top;
		int * s;
		s = (int*)malloc(m * sizeof(int));   //动态申请容量为m的存储空间;
		top = 0;                             //栈顶指针为0,表示此时栈为空;
	return;
	}




//入栈运算
void push(int * s, int m, int * top, int x)
{
	if(*top == m)
		{printf("Stack-overfolw!\n");return;}   //检查栈是否已满;
	
	* top = * top + 1;                          
	s[top - 1] = x;
	
return;
}


//退栈运算
int pop(int * v, int *top)
{
int y;
	if(*top == 0) 
		{printf("Stack-Underflow!\n");return;}
	y = v[*top -1];
	* top = * top - 1;
return (y);
}




//读栈顶
int read(int * v, int *top)
{
	int y;
	if(*top == 0 )
		{printf("Stack_underflow!\n");return;}
	y = v[*top - 1];
return (y);
}




//状态检查
int flag(int *top, int m)
{
	if(*top == m) return (-1);
	if(*top == 0) return ( 0);
return(1);
}


//输出所有元素


void prt_elem(int *v, int * top)
{
	int i;
	printf("top: %d\n",*top);
	for(i = 0; i < *top; i++)
		printf("%d\n",v[i]);
return;
}



例子:

#include <stdio.h>
#include <malloc.h>
//进栈
void push(int *v, int *top, int m, int i)
{
	if(*top == m) 
		{printf("Stack_overflow!\n");return;}
	* top = * top + 1;
	v[*top - 1] = i;
return;
}

//退栈
int pop(int * v, int * top)
{
	int y;
	if(*top == 0)
	{
		printf("Stack_underflow!\n");
		return 0;
	}

	y = v[*top-1];
	*top = * top - 1;
return (y);
}

//读栈
int read(int * v, int *top)
{
	int y;
	if(*top == 0)
	{
		printf("stack_underflow!\n");
		return 0;
	}

	y = v[*top - 1];
return (y);
}

//状态检查;
int flag_stack(int * top, int m)
{
	if(*top == m) return (-1); //上溢
	if(*top == 0) return ( 0);  //栈为空;
return (1);
}
//输出栈中所有元素
void prt_stack(int *v, int *top)
{
int i;
	printf("top: %d\n",*top);
	for(i =0; i < *top; i++)
		printf("%d\n",v[i]);
return;
}
void main()
{
	int * v, top, m, i, x;
	m = 5;   //建立一个能存放十个整形数据的一个栈;
	v = (int*)malloc(m * sizeof(int));
	top = 0;   //初始化栈课为空;
	
	//进行对栈的操作;
	
	if(flag_stack(&top,m)!=-1)
	{
		push(v,&top,m,34);
	}else 
	{
		printf("push fail!\n");
	}

	
	if(flag_stack(&top,m)!=-1)
	{
		push(v,&top,m,324);
	}else 
	{
		printf("push fail!\n");
	}

		if(flag_stack(&top,m)!=-1)
	{
		push(v,&top,m,334);
	}else 
	{
		printf("push fail!\n");
	}

		if(flag_stack(&top,m)!=-1)
	{
		push(v,&top,m,3334);
	}else 
	{
		printf("push fail!\n");
	}

		if(flag_stack(&top,m)!=-1)
	{
		push(v,&top,m,334);
	}else 
	{
		printf("push fail!\n");
	}

	if(flag_stack(&top,m)!=-1)   //在插入第六个元素时,已超出栈的容量,故不会进行插入操作了,这时会提示错误!
	{
		push(v,&top,m,34);
	}else 
	{
		printf("push fail!\n");
	}
	prt_stack(v,&top);

	printf("----------------------------\n");
	
//	int result;
   printf("pop number is : %d\n",pop(v,&top));
   printf("read stack top : %d\n",read(v,&top));
   prt_stack(v,&top);
}

/*-------------运行结果--------------
push fail!
top: 5
34
324
334
3334
334
----------------------------
pop number is : 334
read stack top : 3334
top: 4
34
324
334
3334
Press any key to continue

*/








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值