栈 是特殊的线性表
栈的定义
栈的特点:
- 先进后出,后进先出
- 由于空间限制,会因栈满而发生上溢出(进栈一定要判断栈是否已满)
- 出栈要判断栈是否为空
顺序栈的实现
#define MAXSIZE 100
typedef int datatype:
typedef struct {
datatype a[MAXSIZE];
int top;
}sequence_stack;
判断栈是否已满
int full(squence_stack *s)
{
return s->top==MAXSIZE-1;
}
取栈顶元
datatype read(squence_stack *s)
{
if(!empty(s))//栈不空
return s->a[s->top];
else exit(0);
}
进栈
void push(squence_stack *s,datatype x)
{
if(!full(s))
{
s->data[++s->top]=x
}
else
{
printf("栈已满");
exit(0);
}
}
出栈
void pop(squence_stack *s)
{
if empty(s){printf("栈空,不能出栈!");}
}
else
s->top--;
十进制转八进制数
#include "seqstack.h"
void DtoO(int x)
{
seqstack s; //定义数据栈
init(&s); //初始化数据栈
while(x!=0)
{
push(&s,x%8);
x=x/8;
}
while(!empty(&s))
{
printf("%d",read(&s));
pop(&s);
}
}
表达式求值
- 计算机最适合用后缀表达式
- 后缀表达式特点:
- 在实际应用中,操作数可能为实数,且两个实数间用空格隔开 那如何将整型转为实数?
课后答疑
- 为什么main函数里面传的是地址,函数里面定义指针?
因为是结构体题,地址传递改的是结构体本身,用指针访问所传地址,当形参里面变化时,实参也跟着变化。否则是单向值传递,是结构体的复制品,形参改变后,实参不跟着变 - #include “stdio.h” 与#include <stdio.h>的区别
""定义的是头文件,<>是系统头文件,会去系统找
- 插入数据:进栈;删除数据:出栈
- 递归函数为负数表示栈满
- 表达式求值(待更新)
- 后缀表达式中注意
数字顺序
是不能改变的