学习笔记——C语言基本概念&栈和队列——(14)

本次笔记是C语言的最后学习内容。

1、栈

特点:先进后出

        堆栈又名栈( stack) , 它是一种运算受限的线性表。 限定仅在表尾进行插入和删除操作的线性表。 这一端被称为栈顶, 相对地, 把另一端称为栈底。 向一个栈插入新元素又称作进栈、 入栈或压栈, 它是把新元素放到栈顶元素的上面, 使之成为新的栈顶元素; 从一个栈删除元素又称作出栈或退栈, 它是把栈顶元素删除掉, 使其相邻的元素成为新的栈顶元素。

示意图:

使用数组实现顺序栈:

#include<stdio.h>
#include<stdlib.h>
struct Stu
{
	int num[6];
	int top;
};
int Push_Stu(struct Stu*s,int x);
int mean(void);
int Pop_Stu(struct Stu* s, int* x);

int main()
{
	int num,n;
	//初始化栈
	struct Stu *sta;
	sta=(struct Stu*)malloc(sizeof(struct Stu));
	sta->top=-1;
	while(1)
    {
    	switch (mean())
    	{
    		case 1:
    		printf("请输入要入栈的元素:");
    		scanf("%d",&num);
    		if(Push_Stu(sta,num))
    			printf("入栈成功!\n");
    		else
    			printf("入栈失败!栈已满\n");
			break;
    		case 2:
    		if(Pop_Stu(sta, &num))
                    printf("出栈成功!出栈元素为:%d\n", num);
                else
                    printf("出栈失败!栈已空。\n");
			break;
    		case 3:
    		printf("程序已退出。\n");
    		return 0;break;
    		default:printf("输入错误\n");break;
    	}
    }
}
//定义功能界面
int mean(void)
{
	int num;
	printf("请输入你要执行的操作:\n");
	printf("1.入栈\n");
	printf("2.出栈\n");
	printf("3.退出\n");
	scanf("%d",&num);
	if(num>=1&&num<=3)
	{
		return num;
	}
	else
	{
		printf("输入错误请重新输入:");
		return 0;
	}
}
//定义入栈函数
int Push_Stu(struct Stu*s,int x)
{  	//判断是否为栈满
    if(s->top == 5)
    {
    	return 0;//栈满不能入栈
    }
    else
    {
        s->top++;
        s->num[s->top] = x;
        return 1;
    }
}
//定义出栈的函数
int Pop_Stu(struct Stu* s, int* x)
{  //判断是否为栈空
    if(s->top==-1)
    {
    	 return 0;//栈空不能出栈
    }
        
    else
    {
        *x = s->num[s->top];
        s->top--;
        return 1;
    }
}

使用链表实现顺序栈:

#include<stdio.h>
#include<stdlib.h>
struct Stu
{
	int num[6];
	int top;
};
struct NODE
{
	int num;
	struct NODE*front;
};
int Push_Stu(struct NODE** top, int x);
int mean(void);
int Pop_Stu(struct NODE** top, int* x);

int main()
{
	int num,n;
	//初始化栈
	struct NODE*top=NULL;
	while(1)
    {
    	switch (mean())
    	{
    		case 1:
    		printf("请输入要入栈的元素:");
    		scanf("%d",&num);
    		if(Push_Stu(&top,num))
    			printf("入栈成功!\n");
    		else
    			printf("入栈失败!栈已满\n");
			break;
    		case 2:
    		if(Pop_Stu(&top, &num))
                    printf("出栈成功!出栈元素为:%d\n", num);
                else
                    printf("出栈失败!栈已空。\n");
			break;
    		case 3:
    		printf("程序已退出。\n");
    		return 0;break;
    		default:printf("输入错误\n");break;
    	}
    }
}
//定义功能界面
int mean(void)
{
	int num;
	printf("请输入你要执行的操作:\n");
	printf("1.入栈\n");
	printf("2.出栈\n");
	printf("3.退出\n");
	scanf("%d",&num);
	if(num>=1&&num<=3)
	{
		return num;
	}
	else
	{
		printf("输入错误请重新输入:");
		return 0;
	}
}
//定义入栈函数
int Push_Stu(struct NODE**top,int x)
{  
	struct NODE*new=(struct NODE *)malloc(sizeof(struct NODE));
	//判断是否为栈满
  	new->num=x;
  	new->front=*top;
  	*top=new;
    return 1;
}
//定义出栈的函数
int Pop_Stu(struct NODE**top, int* x)
{  //判断是否为栈空
    if(*top==NULL)
    {
    	 return 0;//栈空不能出栈
    }  
    else
    {
        *x = (*top)->num;
        struct NODE*temp=*top;
        *top=(*top)->front;
        free(temp);
        return 1;
    }
}

2、队列

        队列是一种特殊的线性表,特殊之处在于它只允许在表的前端 ( front)进行删除操作,而在表的后端 ( rear)行插入操作, 和栈一样, 队列是一种操作受限制的线性表。 进行插入操作的端称为队尾, 进行删除操作的称为队头。
        特点: 先进先出

队列就不过多介绍了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值