实验三:栈和队列及其应用
- 实验项目名称:栈和队列及其应用
- 实验目的及要求:
实验目的
(1)理解栈和队列数据类型的动态分配顺序存储结构的表示和运算的C语言实现。
(2)掌握栈和队列结构在实际中的应用。
要求:
(1)设计栈和队列的顺序存储结构(动态分配存储空间);
(2)在顺序存储结构下实现抽象数据类型中定义的各种基本操作。
(3)利用栈和队列的基本操作:设计十进制数转换成二进制数的算法,二进制数转换成八进制数的算法,二进制数转换成十六进制数的算法。
3.实验原理
利用栈先进后出,队列先进先出。
十进制数N转换成d进制数原理:
N = (N div d)×d + N mod d; (其中:div为整除运算,mod为求余运算)
75 = (75/2)*2 + 75%2
例:(75)10 = (1001011)2
N (N div 2) N mod 2
75 37 1
37 18 1
18 9 0
9 4 1
4 2 0
2 1 0
1 0 1
先进后出:
数据生成的顺序:1,1,0,1,0,0,1
读出的顺序:1,0,0,1,0,1,1
二进制数转换成八进制数和十六进制数原理:
三位二进制合为一位八进制数,四位二进制合为一位十六进制数。
队列先进先出。
二进制数转换成八进制数:
(1001011)2 = (1,001,011)2=(113)8
二进制数转换成十六进制数:
(1001011)2 = (100,1011)2 =(4B)16
4.实验内容:
通过键盘接收数据,将十进制数转换成二进制数,再将二进制数转换成八进制数和十六进制数。
实验步骤:
(1)接收一个十进制整数。
(2)利用栈将十进制数转换成二进制数。输出显示二进制数,出栈的同时各位进入队列1和队列2。
(3)利用队列将队列1中的二进制数转换成八进制数,输出显示。
(4)利用队列将队列2中的二进制数转换成十六进制数,输出显示。
5.实验结果与分析:
(1)分析实验中所遇到的问题,自己的解决思路及实现方法。
(2)写出自己所用的测试用例,并记录结果。
(3)总结本次实验的收获。
#include <stdio.h>
#include "stdlib.h"
#include "math.h"
#define STACK_INIT_SIZE 10 // initial allocation of the stack
#define STACKINCREMENT 10// storage increment
#define element int
typedef struct{
element *base;
element *top; //stack top pointer
int stackSize;
} sqStack;
typedef struct qNode{
element data;
struct qNode *next; // queue next pointer
}qNode, *queuePtr;
typedef struct {
queuePtr front; // queue front pointer
queuePtr rear; // queue rear pointer
int length; // queue length
}linkQueue;
// construct an empty queue. return 1 if initialization is successful, 0 otherwise.
int initQueue(linkQueue **qq){
*qq = (linkQueue *)malloc(sizeof(linkQueue));
linkQueue *q = *qq;
q->front = q->rear = (queuePtr)malloc(sizeof(qNode));
// storage allocation failed
if(!q->front){
return 0;
}
q->front->next = NULL;
(*qq)->length = 0;
return 1;
}
// enqueue, return 1 if initialization is successful, 0 otherwise.
int enQueue(linkQueue **qq, element e){
queuePtr p =