本次笔记是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)行插入操作, 和栈一样, 队列是一种操作受限制的线性表。 进行插入操作的端称为队尾, 进行删除操作的称为队头。
特点: 先进先出
队列就不过多介绍了。