第四章 栈和队列

一、顺序栈
1、顺序栈的存储

#define Stacksize 100
typedef int Datatype;
typedef struct
{
Datatype data[Stacksize];
int top;//栈顶元素在数组中的下标
}Seqstack;

2、顺序栈的实现
初始化
把top设置为-1
入栈
在这里插入图片描述

int Push(SeqStack *S, DataType x)
{
if (S->top —-StackSize- 1){
printf("上溢错误,插入失败\n"); return 0;}
s->data[++S->top]  return 1:
}

出栈

int Pop(SeqStack *S, DataType*ptr){//ptr提取元素
if (S->top==-1){
printf("下溢错误,删除失败n");(return 0;}
*ptr=S->data(S->[top--]) return 1;
}

取值
与出栈类似,top不自减
判空

int Empty(SeqStack *S)
{
if(S->top==return1) return 1;
else return 0;
}

二、链栈
1、链栈的存储

typedef int DataType;
/*栈元素的数据类型,假设为int型*/
typedef struct Node
{
DataType data;
/*存放栈元素的数据域*/
struct Node *next;
/*存放下一个结点的地址*/
}Node;
Node *top;

2、链栈的实现
入栈

void Push(Node*(top, DataType{//不用进行判断,链表不会上溢
Node *s = (Node *)malloc(sizeof(Node));
s->data= X;
s->next = top->next; 
top->next=s;
}

出栈

int Pop(Node *top, DataType *ptr)
{
Node *p = top;if (top =- NULL){
printf("下溢错误,删除失败\n"); return 0;}
*ptr = top->data;
top = top->next; free(p);return l;
}

销毁

void DestroyStack(Node *top){
Node *p=top;
while (top !=NULL){
top = top->next;free(p) p=top}
}

三、循环队列
存储结构定义

#define QueueSize 100
/*定义数组的最大长度*/
typedef int DataType;
/*队列元素的数据类型,假设为int型*/
typedef struct
{
DataType data[QueueSize];
/*存放队列元素的数组*/
int front,rear;
/*下标,队头元素和队尾元素的位置*/
}CirQueue;

初始化

void InitQueue(CirQueue *Q)
{
Q->front = Q->rear = QueueSize- 1;
}

判空操作

int Empty(CirQueue *Q){
if(Q->rear == Q->front) return 1;
else return 0;
}

插入操作

int EnQueue(CirQueue *Q, DataType x)
{
if ((Q->rear+1) % QueueSize =- Q->front){
printf(上溢错误,插入失败\n"); return 0;
}
Q->rear = (Q->rear + 1)%QueueSize;
Q->data[Q->rear]=x;
return 1;
}

删除操作

int DeQueue(CirQueue *Q, DataType*ptr){
if(Q->rear== Q->front){
printf(“下溢错误,删除失败\n"); return 0;
}
Q->front =(Q->front+1) % QueueSize;
*ptr = Q->data[Q->front];
return 1;
}

四、链队
存储

typedef int DataType;       /*定义队列元素的数据类型,假设为int型*/
typedef struct Node         /*定义链队列的结点结构*/
{
DataType data;struct Node *next;}
Node;
typedef struct     /*定义链队列*/
{
Node *front,*rear;}
LinkQueue;

入队

void EnQueue(LinkQueue *Q,DataType x)
{
Node *s = (Node * )malloc(sizeof(Node));
s->data= x; s->next = NULL;
Q->rear->next =s; Q->rear = s;
}

出队

int DeQueue(LinkQueue *Q,DataType*ptr){
Node *p;
if(Q->rear ==Q->front){
printf("下溢错误,删除失败\n"); returO;
}
p =Q->front->next;*ptr =p->data;
Q->front->next =p->next;
if(p->next =- NULL)Q->rear =Q->front;
free(p);
return 1;

销毁

void DestroyQueue(LinkQueue *Q)
{
Node *p=Q->front;
while (p !=NULL){
Q->front =p->next;free(p);
p=Q>front;}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
现代操作系统第四版是一本经典的操作系统教材,第三章主要讲解了进程的概念、进程控制块、进程状态以及进程调度等内容。以下是第三章的主要内容概述: 1.进程的概念:进程是程序在执行过程中分配和管理资源的基本单位,每个进程都有自己的地址空间、数据栈、指令计数器、寄存器和文件描述符等。 2.进程控制块:进程控制块是操作系统内核中用于管理进程的数据结构,包含了进程的状态、进程ID、优先级、程序计数器、寄存器、内存分配情况、打开文件列表等信息。 3.进程状态:进程状态包括运行态、就绪态、阻塞态和创建态等,进程在不同状态之间转换,操作系统根据进程状态来进行进程调度。 4.进程调度:进程调度是操作系统内核中的一个重要模块,负责决定哪个进程可以获得CPU的使用权,进程调度算法包括先来先服务、短作业优先、时间片轮转等。 5.进程同步:进程同步是指多个进程之间的协作,包括互斥、信号量、管程等机制,用于保证多个进程之间的正确性和一致性。 6.进程通信:进程通信是指多个进程之间的信息交换,包括共享内存、消息队列、管道等机制,用于实现进程之间的数据传输和共享。 以下是现代操作系统第四版第三章的相关代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <sys/types.h> #include <sys/wait.h> int main() { pid_t pid; int status; pid = fork(); if (pid < 0) { printf("Fork error\n"); exit(1); } else if (pid == 0) { printf("Child process\n"); exit(0); } else { printf("Parent process\n"); wait(&status); printf("Child exit status: %d\n", WEXITSTATUS(status)); } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值