C 链式栈

栈基本概念: 
栈(stack)是限定在表尾进行插入和删除操作的线性表(或单链表)。 
//只能在一端进行插入和删除,因此不存在,在中间进行插入 。表头称为栈底,表尾称为栈顶
空栈:不含任何数据元素的栈。

后进先出或者先进后出

栈的插入操作(push),叫做进栈,或压栈,或入栈 
删除操作(pop),叫做出栈,或弹栈 

typedef struct Node         //链栈结点
{
	int date;               //结点数据
	struct Node *next;      //后续结点指针
}LinkStackNode;

typedef struct satck        //链栈结构
{
	LinkStackNode* top;      //栈顶
	int length;              //链栈长度
}LinkStack;

链栈结构中的top指向Node结构体类型(栈顶),length则记录Node结构体数量(链栈长度)

LinkStack* InitStack()//初始化
{
	LinkStack *S=(LinkStack*)malloc(sizeof(LinkStack));
	S->top=NULL;
	S->length=0;
	return S;
}

让S->top指向空,S->length赋值为0,表示此时为空栈

//入栈
void push(LinkStack *S)
{
	int m,i;
	int elem;                      //入栈元素
	printf("请输入你需要入栈数据的个数:  ");
	scanf("%d",&m);
	for(i=0;i<m;i++)
	{
		printf("你输入的第%d个数据为 :",i+1);
		scanf("%d",&elem);       //输入数据
		LinkStackNode* temp = (LinkStackNode *)malloc(sizeof(LinkStackNode));//申请一个新结点
		temp -> date = elem;          //将数据付给date      
		temp -> next = S->top;     //让新建结点的下一个结点等于现在的栈顶结点
		S -> top = temp;           //新元素作栈顶指针
		S -> length ++;          //链栈长度加一	
	}
}
//出栈
void pop(LinkStack *S)
{
	if(S->length == 0)                                //判断栈是否为空
	{                      
		printf("栈空\n");   
	}  
	int m,i=0;
	printf("最多可出栈%d次,输入多余%d次则出栈最大次数\n",S->length,S->length);
	printf("请输入出栈的次数:");
	scanf("%d",&m);
	if(m>(S->length))
	{
		m=S->length;
	}
	printf("出栈结果为: \n ");
	while(m--)
	{
		i++;
		LinkStackNode *temp=S->top;
		printf("第%d次	%d\n",i,temp->date);                    //输出结点数据
		S->top=temp->next;                              //让栈顶等于新建结点的下一个结点
		free(temp);                                     //释放掉结点temp
		S->length--;                                  //结点个数减一
	}
	printf("\n\n");
}

main函数代码如下:

int main()
{
	int i;                  //用于选择的变量
	LinkStack *S;                //创建栈变量I
	S=InitStack();
	while(1)
	{
		printf("请选择下列操作\n");
		printf("1:进栈操作\n");
		printf("2:出栈操作\n");
		printf("3:退出\n");
		scanf("%d",&i);
		switch(i)
		{
		case 1:push(S); break;              //进栈操作
		case 2:pop(S);  break;              //出栈操作
		case 3:exit(0);                      //退出程序
		default:
			printf("输入错误,请重新输入!!!\n");
			break;
		}
	}
	printf("\n");
	system ("pause");
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值