数据结构--------------栈和队列

【一、基本信息】
【实验课程】 数据结构
【设课形式】 非独立
【课程学分】
【实验项目 栈和队列
【学 号】
【系别专业】 计算机科学与技术
【实验班组】 级 班 组 台
【同组学生】
【实验室名】
【实验日期】
【报告日期】
【二、实验教师对报告的最终评价及处理意见】

实验成绩: (涂改无效)

【三、实验预习】
实验目的和要求:
1、熟练掌握栈和队列的结构,以及这种数据结构的特点;
2、会定义顺序栈、循环队列,能实现栈、队列的基本操作;
3、会利用栈解决典型问题,如数制转换等。
实验内容和原理或涉及的知识点(综合性实验):
用C语言设计实现栈的初始化、入栈、出栈、判空等功能,并利用栈完成数制转换功能设计实现循环队列的定义、初始化、入队、出队、求队列长度等功能。
实验条件
Visual Studio
数据结构实验指导书
【实验过程、数据和实验结果记录】
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
typedef struct {
int* base;
int* top;
int stacksize;
}SqStack;
int InitStack(SqStack* S) {
(S).base = (int)malloc(STACK_INIT_SIZE * sizeof(int));
if (!(*S).base) return -1;
(*S).top = (*S).base;
(S).stacksize = STACK_INIT_SIZE;
return 1;
}
int Push(SqStack
S, int e) {
if ((*S).top - (*S).base >= (*S).stacksize) //栈满
{
(S).base = (int)realloc((*S).base, ((*S).stacksize + STACKINCREMENT) * sizeof(int));
if (!(*S).base) - 1;
(*S).top = (*S).base + (*S).stacksize;
(*S).stacksize += STACKINCREMENT;
}
((S).top++) = e;
return 1;
}
int Pop(SqStack
S, int
e) {
if ((*S).top == (*S).base)return -1;
*e = *–(*S).top;
return 1;
}
int StackEmpty(SqStack S)
{
if (S.base == S.top)
return 1;
return -1;
}
void conversion() {
SqStack S;
int n, e;
InitStack(&S);
printf(“请输入要转换的数\n”);
scanf("%d", &n);
while (n) {
Push(&S, n % 8);
n = n / 8;
}
printf(“转化的结果为:\n”);
while (StackEmpty(S) != 1) {
Pop(&S, &e);
printf("%d", e);
}
}
int main()
{
conversion();
return 0;
}

#include <stdio.h>
#include <stdlib.h>

#define MAXQSIZE 100 //最大队列长度
typedef struct {
int* base; // 动态分配存储空间
int front; // 头指针,若队列不空,指向队列头元素
int rear; // 尾指针,若队列不空,指向队列尾元素 的下一个位置
} SqQueue;

int InitQueue(SqQueue* Q) {
// 构造一个空队列Q
(Q).base = (int)malloc(MAXQSIZE * sizeof(int));
if (!(*Q).base) - 1;
// 存储分配失败
(*Q).front = (*Q).rear = 0;
return 1;
}

int EnQueue(SqQueue* Q, int e) {
// 插入元素e为Q的新的队尾元素
if (((*Q).rear + 1) % MAXQSIZE == (*Q).front)
return -1; //队列满
(*Q).base[(*Q).rear] = e;
(*Q).rear = ((*Q).rear + 1) % MAXQSIZE;
return 1;
}

int DeQueue(SqQueue* Q, int* e) {
// 若队列不空,则删除Q的队头元素,
// 用e返回其值,并返回OK; 否则返回ERROR
if ((*Q).front == (*Q).rear) return -1;
*e = (*Q).base[(*Q).front];
(*Q).front = ((*Q).front + 1) % MAXQSIZE;
return 1;
}

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

int show(SqQueue Q)
{
if (Q.front == Q.rear) return -1;
while (Q.front != Q.rear) {
printf("%d “, Q.base[Q.front]);
Q.front = (Q.front + 1) % MAXQSIZE;
}
printf(”\n");
}

int main()
{
SqQueue Q;
int n = 10;
InitQueue(&Q);
while (1)
{
printf(“请输入你的选项:\n0 退出\t 1.添加队尾元素\t 2.删除队头元素\t 3.队列的长度\t 4.遍历队列\n”);
char ch;
ch = getchar();
getchar();
switch (ch)
{
case ‘0’:
return 0;
case ‘1’:
printf(“请输入你要添加的数据:\n”);
scanf("%d", &n);
getchar();
if (EnQueue(&Q, n) == -1) {
printf(“添加失败,程序结束\n”);
break;
}
break;
case ‘2’:
if (DeQueue(&Q, &n) == -1) {
printf(“队列为空,请先添加数据再删除”);
break;
}
printf(“所要删除的数据为:%d\n”, n);
break;
case ‘3’:
printf(“此时队列的长度为:%d\n”, QueueLength(Q));
break;
case ‘4’:
if (show(Q) == -1) {
printf(“队列为空,请先插元素再查看\n”);
}
break;
default:
printf(“请输入指定的字符\n”);
}
}
return 0;
}

数据结构--------------栈和队列

【实验结果分析】
①根据理论知识对所得到的实验数据或结果进行解释、分析。②对实验结果所作的一般性的判断、归纳、概括,实验的心得体会、建议等。
栈(stack)是限制对元素的插入(push)和删除(pop)只能在一个位置上进行的表,该位置是表的末端,叫做栈的栈顶(top)。栈的基本操作只有两种,压入栈(push)和弹出栈顶(pop),且只能作用于栈顶。只有栈顶元素是可访问的可以把栈结构理解成一个底部封闭,顶部打开的桶。最先进去的元素一定是最后才能取出,最晚进去的元素一定是最先取出。队列,是先进先出的线性表。在具体应用中通常用链表或者数组来实现。队列只允许在后端进行插入操作,在前端进行删除操作。队列的操作方式和堆栈类似,唯一的区别在于队列只允许新数据在后端进行添加。在编写队列的时候要注意队列头指针和尾指针的变化,注意指针的加减要和队列的容量进行取模运算.在入队和出队的操作中要注意所传的参数作为队列的地址为它的引用.