栈与队列

来源:互联网 发布:英文翻译发音软件 编辑:程序博客网 时间:2024/06/16 01:19

一、栈是限定仅在表尾进行插入和删除的线性表
允许插入和删除的一端称为栈顶,另一端称为栈底,栈又称为先进后出的线性表简称LIFO结构

栈的抽象数据类型
ADT 栈
Data
同线性表。元素具有相同的类型,相邻元素具有前驱和后继关系
Operation
InitStack(*S):初始化操作,建立一个空栈S。
DestroyStack(*S):若栈存在,则销毁它。
ClearStack(*S):将栈清空
StackEmpty(S):若栈为空,返回true,否则返回false。
GetTop(S,*e):若栈存在且非空,用e返回S的栈顶元素。
Push(*S,e):若栈S存在,插入新元素e到栈S中并成为栈顶元素。
Pop(*S,*e):删除栈S中栈顶元素,并用e返回其值。
StackLength(S):返回栈S的元素个数。
endADT

栈的结构定义

typedef int SElemType;typedef struct{    SElemType data[MAXSIZE];    int top;}SqStack;

1、进栈操作

Status Push(SqStack *S,SElemType e){    if(S->top==MAXSIZE-1){        return ERROR;    }    S->top++;    S->data[S->top]=e;    return OK;}

2、出栈操作

Status Pop(SqStack *S,SElemType *e){    if(S->top ==-1){        return ERROR;    }    *e=S->data[S->top];    S->top--;    return OK;}

栈的链表存储结构

typedef struct StackNode{    SElemType data;    struct StackNode *next;}StackNode,*LinkStackPtr;typedef struct LinkStack{    LinkStackPtr top;    int count;}LinkStack;

1、进栈操作

Status Push(LinkStack *S,SElemType e){    LinkStackPtr s = (LinkStackPtr)malloc(sizeof(StackNode));    s->data =e;    s->next = S->top;    S->top=s;    S->count++;    return OK;}

2、出栈操作

Status Pop(LinkStack *S,SElemType *e){    LinkStackPtr p;    if(StackEmpty(*S))     return ERROR;    *e = S->top->data;    p=S->top;     S->top =S->top->next;    free(p);    S->count--;    return OK;}

二、队列是只允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的线性表简称FIFO。

队列的抽象数据类型

ADT 队列

Data
同线性表,元素具有相同的类型,相邻元素具有前驱和后继关系。
Operation
InitQueue(*Q):初始化操作,建立一个空队列Q
DestroyQueue(*Q):若队列Q存在,则销毁它。
ClearQueue(*Q):将队列Q清空
QueueEmpty(Q):若队列Q为空,返回true,否则返回false。
GetHead(Q,*e):若队列Q存在,用e返回队列Q的队头元素
EnQueue(*Q,e):若队列Q存在,插入新元素e到队列Q中并成为队尾元素。
DeQueue(*Q,*e):删除队列Q中队头元素,并用e返回其值。
QueueLength(Q):返回队列Q的元素个数。
endADT
循环队列的顺序存储结构

typedef int QElemType;typedef struct{    QElemType data[MAXSIZE];    int front;    int rear;}SqQueue;

循环队列的初始化

Status InitQueue(SqQueue *Q){    Q->front =0;    Q->rear =0;    return OK;}

循环队列长度:

int QueueLength(SqQueue Q){    return (Q.rear-Q.front+MAXSIZE)%MAXSIZE;}

入队操作

Status EnQueue(SqQueue *Q,QElemType e){    if((Q->rear+1)%MAXSIZE==Q->front)        return OK;    Q->data[Q->rear]=e;    Q->rear=(Q->rear+1)%MAXSIZE;    return OK:}

出队

Status DeQueue(SqQueue *Q,QElemType *e){    if(Q->front == Q->rear)        return ERROR;    *e=Q->data[Q->front];    Q->front = (Q->front+1)%MAXSIZE;    return OK;}

队列的链式存储
链队列结构

typedef int QElemType;typedef struct QNode{    QEleType data;    struct QNode *next;}QNode,*QueuePtr;typedef struct{    QueuePtr front,rear;}LinkQueue;

入队

Status EnQueue(LinkQueue *Q,QElemType e){    QueuePtr s = (QueuePtr)malloc(sizeof(QNode));    if(!s)        exit(OVERFLOW);    s->data =e;    s->next = NULL;    Q->rear->next=s;    Q->rear=s;    return OK;}

出队

Status DeQueue(LinkQueue *Q,QElemType *e){    QueuePtr p;    if(Q->front == Q->rear)        return ERROR;    p=Q->front->next;    *e=p->data;    Q->front->next=p->next;    if(Q->rear ==p)        Q->rear=Q->front;    free(p);    return OK;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 书本湿的很严重怎么办 除湿盒的水满了怎么办 书被水泡变黄了怎么办 文件纸被弄皱了怎么办 纸的一角皱了怎么办 裤子被雨水打湿变色了怎么办 书本上粘了有油怎么办 手被水泡了皱了怎么办 水泡破了感染了怎么办 夏天腋下出汗会弄湿衣服怎么办 夏天腋下出汗多弄湿衣服怎么办 上眼皮干燥起皮怎么办 怀孕下面湿又痒怎么办 内裤穿久了有异味怎么办 刨腹产私处捂烂了怎么办 猫咬手指出血了怎么办 老有白带涌出来怎么办 耳朵里塞了珠子怎么办 树脂发光字烧了怎么办 马蹄莲长得太高怎么办 百合球的芽断了怎么办 种的百合开败怎么办 盆栽百合花开完之后怎么办 土养百合花谢了怎么办 多肉叶子不饱满怎么办 冬天富贵竹叶子发黄怎么办水养 富贵竹叶子发黄怎么办水养 水养富贵竹有虫怎么办 水养的富贵竹叶子发黄怎么办 百合花水里的盐放多了怎么办 芦荟叶子发黄干瘪了怎么办 水插百合不开花怎么办 干百合冷水泡了怎么办 牡丹籽油过期了怎么办 ps画布建小了怎么办 腰突然疼的受不了了怎么办 微信里面打不开表格怎么办? 浏览器未正常加载相关控件怎么办 猫的眼睛发炎了怎么办 橡胶手机壳松了怎么办 橡胶手机壳小了怎么办