顺序栈与链队列C语言实验报告,数据结构实验二——顺序栈,链栈,循环队列,链队列.doc...

实验报告二

实验课名称:数据结构与程序设计实验实验名称:顺序班级:学号:姓名:时间:一、问题描述

顺序栈

顺序的C语言描述

基本运算的算法——置空、、

链栈的C语言描述

基本运算的算法——置空、、

循环队列的C语言描述

基本运算的算法——

链队列的C语言描述

基本运算的算法——

顺序栈

typedef struct{ //定义栈的数据结构

SElemType *base; //栈底指针

SElemType *top; //栈顶指针

int stacksize; //栈当前存储大小

}sqstack;

链栈

typedef struct StackNode{

SElemType data; //数据域

struct StackNode *next; //结点指针

}StackNode,*LinkStack;

循环队列

typedef struct{

QElemType *base;

int rear; //队尾

int front; //队首

int count; //队内元素数目

int size; //队列存储大小

}sqQueue;

为了方便循环队列判定队满队空,故加了一个数据域存储当前元素个数。

链队列

typedef struct QNode{ //结点结构体

QElemType data; //数据域

struct QNode *next; //指针域

}QNode,*QueuePtr; //结点,节点指针

typedef struct{ //队列结构体

QueuePtr front; //头指针

QueuePtr rear; //尾指针

}LinkQueue;

算法设计

顺序栈

构造空栈:malloc分配内存;

判断是否分配失败,失败则exit

S.top=S.base;初始化栈顶

初始化存储容量

置空栈:S.top=S.base; 栈顶重新指向栈底

判栈空:if(S.top==S.base);

判栈满:if(S.top-S.base>=S.stacksize);看栈首尾差距是否>=栈当前存储大小

进栈:判栈满;若满realloc重新分配内存

判断是否分配失败,失败则exit

S.top=S.base+S.stacksize;赋值新栈顶

S.stacksize+=stackincrement;赋值给新的当前存储大小

*S.top++=e; 进栈元素赋值给top后,top上移

出栈:判栈空,若空返回error

e=*--S.top;,下移top指针后赋值给e

读取栈顶元素:判栈空,若空返回error

e=*(S.top-1); 顶元素赋值给e

输出栈:for循环输出,须满足条件top>base

链栈

构造空栈:malloc分配内存;

判断是否分配失败,失败则exit

S->next=NULL;使指针指向空

判栈空:if(!S->next)判断s是否指向空指针

置空栈:暂存S的下一个节点指针到p

while(p)循环 q=p 把p赋值给q

p=p->next; p指向下一个

释放q

通过该循环则从第一个结点开始逐个释放到最后一个

进栈:定义结点指针p,通过while(p->next)循环使其指向栈顶结点

malloc分配结点内存;

判断是否分配失败,失败则exit

新节点的数据域赋值e;

p指向新结点

新节点指向空

出栈:判栈空,若空返回error

定义结点指针p和q,通过while(p->next)循环使p指向栈顶,q指向栈顶前一个

把p的数据域赋值给e

释放p

q的指针指向空

读取栈顶元素:判栈空,若空返回error

定义结点指针p,通过while(p->next)循环使其指向栈顶结点

把p的数据域赋值给e

循环队列

构造空队列:malloc分配内存;

判断是否分配失败,失败则exit

初始化队首、队尾、队内元素个数为0

初始化队列存储空间

置空队列:将队首、队尾、队内元素个数重新置0

判空队列:if(Q.count==0)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
顺序队列的实现: ```c #include <stdio.h> #include <stdlib.h> #define MAXSIZE 100 // 队列的最大长度 typedef struct{ int data[MAXSIZE]; int front; // 队头指针,指向队头元素 int rear; // 队尾指针,指向队尾元素的后一个位置 }SqQueue; // 初始化队列 void InitQueue(SqQueue *Q){ Q->front = 0; Q->rear = 0; } // 判断队列是否为空 int IsEmptyQueue(SqQueue Q){ if(Q.front == Q.rear) return 1; else return 0; } // 判断队列是否已满 int IsFullQueue(SqQueue Q){ if((Q.rear+1)%MAXSIZE == Q.front) return 1; else return 0; } // 入队 int EnQueue(SqQueue *Q, int data){ if(IsFullQueue(*Q)){ printf("Queue is full\n"); return 0; } Q->data[Q->rear] = data; Q->rear = (Q->rear+1)%MAXSIZE; return 1; } // 出队 int DeQueue(SqQueue *Q, int *data){ if(IsEmptyQueue(*Q)){ printf("Queue is empty\n"); return 0; } *data = Q->data[Q->front]; Q->front = (Q->front+1)%MAXSIZE; return 1; } // 输出队列 void PrintQueue(SqQueue Q){ if(IsEmptyQueue(Q)){ printf("Queue is empty\n"); return; } int i = Q.front; while(i != Q.rear){ printf("%d ", Q.data[i]); i = (i+1)%MAXSIZE; } printf("\n"); } int main(){ SqQueue Q; // 声明一个队列 InitQueue(&Q); // 初始化队列 int flag = 1, choice, data; while(flag){ // 循环操作 printf("1. EnQueue\n"); printf("2. DeQueue\n"); printf("3. PrintQueue\n"); printf("0. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch(choice){ case 0: flag = 0; break; case 1: printf("Enter data to Enqueue: "); scanf("%d", &data); if(EnQueue(&Q, data)) printf("Enqueue %d successfully!\n", data); break; case 2: if(DeQueue(&Q, &data)) printf("Dequeue %d successfully!\n", data); break; case 3: PrintQueue(Q); break; default: printf("Invalid choice\n"); } } return 0; } ``` 链队列实现: ```c #include <stdio.h> #include <stdlib.h> typedef struct Node{ // 链队列结点的定义 int data; struct Node *next; }Node, *pNode; typedef struct{ // 链队列的定义 pNode front; // 队头指针 pNode rear; // 队尾指针 }LinkQueue; // 初始化队列 void InitQueue(LinkQueue *Q){ Q->front = Q->rear = (pNode)malloc(sizeof(Node)); Q->front->next = NULL; } // 判断队列是否为空 int IsEmptyQueue(LinkQueue Q){ if(Q.front == Q.rear) return 1; else return 0; } // 入队 void EnQueue(LinkQueue *Q, int data){ pNode p; p = (pNode)malloc(sizeof(Node)); p->data = data; p->next = NULL; Q->rear->next = p; Q->rear = p; } // 出队 int DeQueue(LinkQueue *Q, int *data){ if(IsEmptyQueue(*Q)){ printf("Queue is empty\n"); return 0; } pNode p = Q->front->next; *data = p->data; Q->front->next = p->next; if(Q->rear == p) // 如果队列只有一个元素 Q->rear = Q->front; free(p); return 1; } // 输出队列 void PrintQueue(LinkQueue Q){ if(IsEmptyQueue(Q)){ printf("Queue is empty\n"); return; } pNode p = Q.front->next; while(p){ printf("%d ", p->data); p = p->next; } printf("\n"); } int main(){ LinkQueue Q; // 声明一个队列 InitQueue(&Q); // 初始化队列 int flag = 1, choice, data; while(flag){ // 循环操作 printf("1. EnQueue\n"); printf("2. DeQueue\n"); printf("3. PrintQueue\n"); printf("0. Exit\n"); printf("Enter your choice: "); scanf("%d", &choice); switch(choice){ case 0: flag = 0; break; case 1: printf("Enter data to Enqueue: "); scanf("%d", &data); EnQueue(&Q, data); printf("Enqueue %d successfully!\n", data); break; case 2: if(DeQueue(&Q, &data)) printf("Dequeue %d successfully!\n", data); break; case 3: PrintQueue(Q); break; default: printf("Invalid choice\n"); } } return 0; } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值