第三章 栈和队列

一、      

1)栈的定义:栈是限定仅在表尾进行插入和删除操作的线性表,允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。

2)在任何时候出栈的元素都只能是栈顶元素,即最后最后入栈者最先出栈。所以栈中元素除了具有线性关系外,还具有后进先出的特性。

3 栈的抽象数据类型定义:

ADT Stack

Data

栈中元素具有相同类型及后进先出特性,相邻元素具有前驱和后继关系

Operation

Initstack

前置条件:栈不存在

输入:无

功能:栈的初始化

输出:无

后置条件:构造一个空栈

Destroystack

前置条件:栈已存在

输入:无

功能:销毁栈

输出:无

后置条件:释放栈所占用的存储空间

Push

前置条件:栈已存在

输入:元素值x

功能:入栈操作,在栈顶插入一个元素x

输出:如果插入不成功,则抛出异常

后置条件:如果插入成功,则栈顶增加一个元素

Pop

前置条件:栈已存在

输入:无

功能:出栈操作,删除栈顶元素

输出:如果删除成功,返回被删元素值,否则,抛出异常

后置条件:如果删除成功,则栈顶减少了一个元素

GetTop

前置条件:栈已存在

输入:无

功能:取栈顶元素,读取当前的栈顶元素

输出:若栈不空,返回当前的栈顶元素值

后置条件:栈不变

Empty

前置条件:栈已存在

输入:无

功能:判空操作,判断栈是否为空

输出:如果站为空,返回1,否则返回0

后置条件:栈不变

endADT

4)栈的顺序存储结构称为顺序栈

1、顺序栈入站算法Push

template<classDT>

VoidSeqstack<DT>::Push(DTx)

{

If(top==StackSize-1)throw”上溢”;

Data[++top]=x;

}

2、顺序栈出栈算法Pop

template<classDT>

DTSeqstack<DT>::Pop()

{

If(top==-1)throw”下溢

3、两栈共享空间入栈算法Push

template<classDT>

voidBothstack<DT>::Push(intI,DTx)

{

If(top1==top2-1)throw”上溢”;

If(i==1)data[++top1]=x;

If(i==2)data[--top2]=x;

}

4、两栈共享空间出栈算法Pop

template<classDT>

DTBothstack<DT>::Pop(inti)

{

if(i==1){

if(top1==-1)throw”下溢

returndata[top1--];

}

If(i==2){

If(top2==stacksize)throw”下溢

returndata[top2++];

}

}

5 栈的链接存储结构称为链栈

1、链栈入栈算法Push

template<classDT>

voidLinkstack<DT>::Push(DTx)

{

S=newNode;s->data=x;

s->next=top;top=s;

}

2、链栈入栈算法Pop

template<classDT>

DTLinkstack<DT>::Pop()

{

If(top==NULL)throw”下溢”;

X=top->data;p=top;

Top=top->next;

Deletep;

Returnx;

}

二、      队列

1 队列的定义:队列是只允许在一端进行插入操作,在另一端进行删除操作的线性表。允许插入的一端称为队尾,允许删除的一端称为对头。队列中的元素除了具有线性关系外,还具有先进先出的特性。

2)队列的顺序存储结构­­----循环队列

1、循环队列入队算法EnQueue

template<classDT>

VoidCirQueue<DT>::EnQueue(DT X)

{

If((rear+1)%QueueSize==front)throw”上溢

rear=(rear+1)%QueueSize;

data[rear]=x;

}

2、循环队列出队算法DeQueue

template<classDT>

DTCirQueue<DT>::DeQueue()

{

if(rear==front)throw”下溢”;

Front=(front+1)%QueueSize;

Returndata[front];

}

3、读取队头元素算法GetQueue

template<classDT>

DTCirQueue<DT>::GetQueue()

{

if(rear==front)throw”下溢”;

i=(front+1)%QueueSize;

returndata[i];

}

3)队列的链接存储结构----链队列

1、链队列构造函数算法LinkQueue

 template<classDT>

LinkQueue<DT>::LinkQueue()

{
s=new Node;s->next=NULL;

Front=rear=s;

}

2、链队列入队算法EnQueue

template<classDT>

voidLinkQueue<DT>::EnQueue(DTx)

{

S=newNode;s->data=x;

s->next=s;

rear=s;

}

3、链队列出队算法DeQueue

template<classDT>

DTLinkQueue<DT>::DeQueue()

{

if(rear==front)throw”下溢”;

p=front->next;x=p->data;

front->next=p->next;

if(p->next==NULL)rear=front;

deletep;

returnx;

}

 

  • 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、付费专栏及课程。

余额充值