栈和队列——分别用顺序表和链表实现——C语言实现

//author   hernoforgot

//本次简单模拟栈和队列的操作,其中大多数我以无返回值实现,如果考虑优化和特殊情况,可稍微修改

//建议使用笔画一下操作流程,可以有助于您理解

//如果有错,或者有什么意见,欢迎留言,thanks!

/*

栈和队列 (线性结构)可以用链表,也可以用数组实现
区别: 栈 在一端操作  先进后出
       队列 一端插入,另一端删除
1.栈: 插入和删除的一端 栈顶
   其余一端 不能操作 称为栈底
    是功能受限的线性表,与循序表不同的是不能在中间插入 
进程  入栈 (压栈)  ,出栈(取出数据)
作用:用于求某个进制  
《若用链表实现,需要销毁链表》
2.队列: 
插入队头   删除数据
或者队尾   插入数据
数组需要判断队满或者队空  链表不需要
      应用:先到先得

*/




#include<stdio.h>

#include <stdlib.h>

/*******************************************  *******************************************************/

typedef struct stack{
int data[20]; //存放数据
int size; //数组大小
int top; //用下标形式表示栈顶
}STACK;


//初始化栈
void init(STACK *st){
st->top = 0;
st->size = 20;  //指针,不能用点运算符
}


//入栈,存储数据
void pushStack(STACK *st, int data){
if (st->top >= st->size){
printf("栈已满 不能入栈");
return;
}                                                           
st->data[st->top] = data;
st->top++;
}
//出栈  删除数据,只能在栈顶实现  并得到出栈元素
int popStack(STACK *st){
if (st->top <= 0){
printf("栈空的,无法实现出栈");
return -1;
}
st->top--;
return st->data[st->top];
}
int main(){
STACK stack;
init(&stack);
//输入数据
for (int i = 0; i < 10; i++){
pushStack(&stack,i);
}
//可以发现是先进后出
//输出一定个数的数据
for (int i = 0; i < 10; i++){
printf("%d\t",popStack(&stack));

}

    getchar();

return 0;
}

/********************************   队列  ******************************************************************/


//写了一个结构体 并为之起别名 方便使用

typedef struct node{
public:
int data;
struct node *next;
}NODE, *PNODE;
//使用队列头和队列尾
struct list{
PNODE front;  //用作队头
PNODE end;    //用作队尾
}List; //定义一个结构体变量,注意没有typedef 不是起别名
//先初始化队列链表--队头和队尾
void init(){
List.front = NULL;
List.end = NULL;
}
//压队,即入队
void pushList(int data){
//申请临时节点 并且压入节点数据
PNODE temp = (PNODE)malloc(sizeof(NODE));
temp->data = data;
//判断队列是否为空 
if (List.front == NULL){
//队列为空 利用队头进行数据输入 队尾指向该新插入的节点
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 == NULL){
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();
return 0;

}

PS:希望此文章对您有帮助

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值