//author hernoforgot
//这次简单模拟了堆栈和队列的操作,其中很多都是我在没有返回值的情况下安装的,但是考虑到最优化和特殊情况,可以稍微修改一下
//建议使用笔划绘制操作流程。 有助于理解
//如果有错误或者有什么意见的话,欢迎留言。 thanks!
/*
堆栈和队列(线性结构)可以通过链表或数组来实现
区别:堆栈在一端操作先出来
队列的一端被插入,另一端被删除
1 .堆栈:插入和删除的一端堆栈顶部
剩下的一端不能操作称为堆栈底
功能受限的线形表,与顺序表不同,不能插入中间
进程堆栈、外堆栈和数据检索
作用:用于求某个进制
《若用链表实现,需要销毁链表》
2 .队列:
插入标题以删除数据
或者在队尾插入数据
数组需要判断团队是否已满,是否不需要团队的空闲链表
应用:先到先得
*/
#includestdio.h
# include stdlib.h/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * h/* * * * * * h
typedef struct stack{
int data[20]; //保存数据
int size; //数组大小
int top; //用下标表示堆栈顶部
}堆栈;
//初始化堆栈
voidinit(stack*ST )。
st-top=0;
st-size=20; //指针,不能使用点运算符
}
//进入堆栈,保存数据
voidpushstack(stack*ST,int data )。
if(ST-top=ST-size ) {
printf (堆栈已满,无法进入堆栈);
返回;
}
st-data[st-top]=data;
st-top;
}
//只能从堆栈中删除数据,在堆栈顶部安装得到堆栈元素
intpopstack(stack*ST ) )
if(ST-top=0) {
printf (堆栈为空,无法实现堆栈) );
返回- 1;
}
ST-top----;
return st-data[st-top];
}
int main ()。
堆栈;
init (堆栈;
//输入数据
for(intI=0; i 10; I ) {
推式堆栈(stack,I );
}
可见是先进的后来人
//输出一定个数的数据
for(intI=0; i 10; I ) {
printf(%d(t ),Popstack ) );
}
getchar (;
返回0;
}
/* * * * * * * * * * * *队列* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *队列
//便于编写结构并为其取别名
typedef struct node{
公共:
int data;
struct node *next;
}NODE,*PNODE;
//使用队列头和队列尾
struct list{
PNODE front; //作为团队领导使用
PNODE end; //在队伍的最后使用
(}List; //定义结构变量,注意没有typedef,而不是附加别名
//先初始化队列列表---团队领导和团队尾
void init ()
List.front=NULL;
List.end=NULL;
}
控制队伍,即入团
voidpushlist(intdata ) {
//申请临时节点,推入节点数据
podetemp=(pnode ) malloc (sizeof ) node );
temp-data=data;
//判断队列是否为空
if (list.front==空值) {
//队列为空,使用队列头进行数据输入的队列末尾是指其新插入的节点
List.front=temp;
List.front-data=data;
List.end=temp;
List.end-next=NULL;
}
else{
//插入队列,使队列的末尾指向新插入的节点,而不是空的
List.end-next=temp;
List.end=List.end-next;
List.end-data=data;
List.end-next=NULL;
}
}
//出队
void outList () }
//先判断队列是否为空
if (list.end==空值) {
printf ('队列为空且无法退出堆栈);
}
else {
printf('%d”,List.front-data );
PNODE temp; //在临时节点上指向当前队列头,释放其内存
temp=List.front;
List.front=List.front-next;
free(temp );
//只有一个团队要素表示是特殊情况,需要注意
//如果不将队尾List.end指向天空,就会变成野针
if(list.front==null ) )。
{
free(list.front ); List.end=NULL;
}
}
}
//删除队列类似于堆栈
void deleteList (
outList (;
}
int main ()。
//测试
init (;
int i;
for(I=0; i 10; I )
pushlist(I;
for(I=0; i 10; I )
outList (;
getchar (;
返回0;
}
PS :希望这篇文章能有帮助