C语言程序设计-第十一章 综合实训—学生成绩管理系统
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
的末端,当元素进栈时,都从两端向中间靠拢,这样就可以达到在使用过程中有的栈占有的空间多一些,
有的栈占有的空间少一些,公共的剩余空间可以调节使用,从而提高了存储空间的利用率。
1
2
3
…
n
data
a1
a2
a3
…
an
m
m+1
…
MAN-1
bm
…
b2
b1
栈1底
top1
top2
栈2底
双栈共享存储空间
存储结构可定义为
2. 栈的基本算法的实现 ❖ ⑴ 栈的初始化
❖ void init(stack *s) ❖ { s->top=0; ❖}
❖ ⑵ 判空栈
❖ int empty(stack *s) ❖ { if(s->top==0) return 1; ❖ else return 0; ❖}
⑶ 入栈
❖ void push (stack *s, datatype N)
❖
❖ void InitStack(SeqStack * S) //置栈空
❖{
❖
S->top = -1;
❖}
❖
问题情境及实现
❖ void Pop(SeqStack * S, int * N) //出栈,N用来接受被弹出的数的
❖{
❖
*N = S->data[S->top];
❖
S->top--;
❖}
❖
❖ { if (s->top==MAN-1)
❖
printf("栈满");
❖ else
❖ { s->top++;
❖
s->data[s->top]=N;
❖}
❖}
⑷ 出栈
❖ void pop(stack *s,datatype *N)
❖ { if(empty(s))
❖
printf("栈空");
❖ else
【】
将从键盘输入的十进制数转换为N(如二进制、八进制、十六进制)进制数据,利用顺序栈实现数制 转换问题
【】
十进制转化成N进制的算法是 //整数部分为除N取余法,小数部分为乘N取整法。例如:对1348这个数, 转化为N进制,也就是解方程1348=aN^5+bN^4+cN^3+dN^2+eN^1+f,目标就是要求出系数 a,b,c,d,e,f的值(也许a的前面还有w*N^6甚至7次方等等,但是次数太高的话就必然会是0),比如 我们假定N=10的话,那么求出来的结果必然是a=b=0,c=1,d=3,e=4,f=8 。对于N进制来说, a,b,c,d,e,f的值都必然要小于N(否则就会向高位进一),显然求解的过程是:将1348除以10(令 N=10),则余数就是f ,即8,则商则是aN^4+bN^3+cN^2+dN^1+e,这样进一步除以10得e,依次得 到d,c,b,a,可用堆栈来实现。
❖ { *N=s->data[s->top];
❖
s->top--;
❖
}
❖}
⑸ 取栈顶元素
❖ datatype get(stack *s)
❖ { if(empty(s))
❖
printf("栈空");
❖
else
❖
return(s->data[s->top]);
❖}
1.3 双栈的操作
❖
让两个栈共享一个数组的存储空间,让一个栈的栈底为该空间的始端,另一个栈的栈底为该空间
❖ #define MAN 栈中允许存放元素的最大个数
❖ typedef struct
❖ { datatype data[MAN];
❖
int top;
❖ }stack;
1.2 栈的运算 ❖ 1. 栈的基本操作
❖ ⑴ 栈初始化:init(s) 构造了一个空栈; ❖ ⑵ 判栈空:empty(s) 若栈s为空栈返回为1,否则返回为0; ❖ ⑶ 入栈:push(s,N) 在栈s的顶部插入一个新元素N,使N成为新的栈顶元素; ❖ ⑷ 出栈:pop(s) 栈s的顶部元素从栈中删除; ❖ ⑸ 读栈顶元素:get(s) 取栈顶元素作为结果返回; ❖ ⑹ 置栈空:clear(s) 清除栈s中的所有元素,使之成为空栈。
❖
printf("%d",N);
❖
else
❖
printf("%c",N + 55); //使输出的时候大于9的输出为字母ABC
❖
}
❖
❖
printf("\n");
❖
}
❖
return 0;
❖}
相关知识 1. 栈 2. 队列
本讲小结
1栈
❖ 1.1 栈的定义及顺序存储 ❖ 1.2 栈的运算 ❖ 1.3 双栈的操作 ❖ 1.4 栈的应用
❖
if(n < 0)
❖
n = -n;
❖
if(n == 0)
❖
Push(S, 0);
❖
while(n)
❖
Hale Waihona Puke Baidu
{
❖
Push(S, n%d);
❖
n /= d;
❖
}
❖}
问题情境及实现
❖ int main()
❖{
❖
int n,d,N; //n为一个十进制数,d为进制
❖
SeqStack stack, *S;
❖
S = &stack;
❖ #define MAN 双栈中允许存放元素的最大个数
❖ typedef struct
❖ void Push(SeqStack * S, int N) //入栈
❖{
❖
S->top++;
❖
S->data[S->top] = N;
❖}
❖
❖ void Conversion(SeqStack * S, int n, int d) //n为一个十进制数,d为进制
❖{
❖
if(d < 0)
❖
printf("ERROR!\n");
1.1 栈的定义及顺序存储 ❖ 1. 栈的定义
❖
栈又叫堆栈,允许在表的一端进行插入和删除 。后进先出的线性表(简称 LIFO表)。
MAN-1 ┇ i ┇ 2 1 0
top
空栈
top
an
┇
a3
┇
top
a2
a3 top
a1
a2
a3 a2
top a1
a1
a1
1个元素
3个元素
2个元素
栈满
2. 栈的顺序存储
❖
❖
while(scanf("%d %d",&n,&d) != EOF)
❖
{
❖
InitStack(S); //初始化
❖
Conversion(S, n, d);
❖
if(n < 0)
❖
printf("%c",'-'); //若是负数
❖
while(S->top != -1)
❖
{
❖
Pop(S, &N);
❖
if(N < 10)
问题情境及实现
❖ /*
❖
堆栈的应用---进制转换
❖
将十进制转换成其他进制
❖ */
❖ #include <stdio.h>
❖ #define maNlen 100
❖
❖ typedef struct //堆栈的结构大家应该都很熟悉了
❖{
❖
int data[maNlen];
❖
int top;
❖ }SeqStack;