本次笔记是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");elseprintf("入栈失败!栈已满\n");break;case 2:if(Pop_Stu(sta, &num))printf("出栈成功!出栈元素为:%d\n", num);elseprintf("出栈失败!栈已空。\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");elseprintf("入栈失败!栈已满\n");break;case 2:if(Pop_Stu(&top, &num))printf("出栈成功!出栈元素为:%d\n", num);elseprintf("出栈失败!栈已空。\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)行插入操作, 和栈一样, 队列是一种操作受限制的线性表。 进行插入操作的端称为队尾, 进行删除操作的称为队头。
特点: 先进先出
队列就不过多介绍了。