要求:利用书本上的栈的顺序存储结构定义, #define STACK_INIT_SIZE 100 //存储空间初始分配量 typedef struct SElemType base, base 的初值为NULL SElemType top 找顶指针 int stacksice: 当前已分配的存储空间,以元素为单位+ SgStack 1)编写完成下列功能的函数:(1》初始化一个空栈;(2)随机创建一个包含正整数值的栈(当输入-1时创建结束);(3)将一个数x插在栈顶(x在程序运行时输入);(4)将樣顶元素弹出,并在弹出结束后输出弹出元素的值;(5)输出栈顶元素的值;(6)求栈的长度;(7)输出从栈底到栈顶的所有元素。 2)用主函数调用你所编写的函数,并在使持有所变化的每一步输出栈从栈顶到栈底的所有元素,以验证你编程序的正确性。 备注:(1要求编一菜单,根据选项逐个调用各函数;(2)所编程序要具有一定的健壮性,即;在插入删除时要考虑找空、栈满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。 2.队列的链式存储结构的实现 要求:利用书本上的链队列有关类型定义, typedef struct 2元{//结点类型。
备注:(1) 要求酒米 性,即:在插入删除时要考虑栈空、栈满、位置是否合法等情况,当输入数据非法时,程序也能适当的做出反应,而不致于出现莫名其妙的结果。
#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 100
typedef int SElemType; // 假设栈元素为整数类型
typedef struct {
SElemType *base; // 栈底指针
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间大小
} SqStack;
// 初始化一个空栈
void InitStack(SqStack *S) {
S->base = (SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));
if (!S->base) {
printf("内存分配失败\n");
exit(1);
}
S->top = S->base;
S->stacksize = STACK_INIT_SIZE;
}
// 销毁栈
void DestroyStack(SqStack *S) {
free(S->base);
S->base = S->top = NULL;
S->stacksize = 0;
}
// 将元素x插入栈顶
void Push(SqStack *S, SElemType x) {
if (S->top - S->base >= S->stacksize) {
printf("栈满,无法插入元素\n");
return;
}
*(S->top) = x;
S->top++;
}
// 弹出栈顶元素,并返回其值
SElemType Pop(SqStack *S) {
if (S->top == S->base) {
printf("栈为空\n");
exit(1);
}
S->top--;
return *(S->top);
}
// 返回栈顶元素的值
SElemType GetTop(SqStack *S) {
if (S->top == S->base) {
printf("栈为空\n");
exit(1);
}
return *(S->top - 1);
}
// 返回栈的长度
int StackLength(SqStack *S) {
return S->top - S->base;
}
// 输出从栈底到栈顶的所有元素
void PrintStack(SqStack *S) {
SElemType *p = S->base;
while (p < S->top) {
printf("%d ", *p);
p++;
}
printf("\n");
}
int main() {
SqStack S;
InitStack(&S);
int choice, x;
while (1) {
printf("1. 插入元素\n2. 删除栈顶元素\n3. 输出栈顶元素\n4. 栈的长度\n5. 输出所有元素\n0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要插入的元素: ");
scanf("%d", &x);
Push(&S, x);
break;
case 2:
printf("弹出的元素值为: %d\n", Pop(&S));
break;
case 3:
printf("栈顶元素值为: %d\n", GetTop(&S));
break;
case 4:
printf("栈的长度为: %d\n", StackLength(&S));
break;
case 5:
printf("栈中的元素为: ");
PrintStack(&S);
break;
case 0:
DestroyStack(&S);
exit(0);
default:
printf("无效的选项\n");
}
}
return 0;
}
2、队列的链式存储结构的实现 要求:利用书本上的链队列有关类型定义, typedef struct QNode{//结点类型 QElemType data: struct QNode next}odeueuePtr:+ typedef struct(//链队列类型。 QueuePtr front: // 队头指针 QueuePtr rear://队尾指针} LinkQueue: 1)编写完成下列功能的函数:(1)初始化一个带头结点的空队列;(2)根据随机输入的队列长度和队列中整数型数据元素的值,创建一个非空链队列;(3)将一个数x插到队尾(x在程序运行时随机输入);(4)删除队头元素,并在删除结束后输出删除元素的值;(5)判定队列是否为空,若不空输出队头元素;(6)输出队列中所有元素。 2)用主函数调用你所编写的函数,并在使队列有所变化的每一步输出队列中的从队头 I 到队尾的元素,以验证你编程序的正确性。
#include <stdio.h>
#include <stdlib.h>
typedef int QElemType; // 假设队列元素为整数类型
// 链队列结点定义
typedef struct QNode {
QElemType data;
struct QNode *next;
} QNode, *QueuePtr;
// 链队列类型定义
typedef struct {
QueuePtr front; // 队头指针
QueuePtr rear; // 队尾指针
} LinkQueue;
// 初始化一个带头结点的空队列
void InitQueue(LinkQueue *Q) {
Q->front = Q->rear = (QueuePtr)malloc(sizeof(QNode));
if (!Q->front) {
printf("内存分配失败\n");
exit(1);
}
Q->front->next = NULL;
}
// 销毁队列
void DestroyQueue(LinkQueue *Q) {
while (Q->front) {
Q->rear = Q->front->next;
free(Q->front);
Q->front = Q->rear;
}
}
// 插入元素x到队尾
void EnQueue(LinkQueue *Q, QElemType x) {
QueuePtr p = (QueuePtr)malloc(sizeof(QNode));
if (!p) {
printf("内存分配失败\n");
exit(1);
}
p->data = x;
p->next = NULL;
Q->rear->next = p;
Q->rear = p;
}
// 删除队头元素,并返回其值
QElemType DeQueue(LinkQueue *Q) {
if (Q->front == Q->rear) {
printf("队列为空\n");
exit(1);
}
QueuePtr p = Q->front->next;
QElemType x = p->data;
Q->front->next = p->next;
if (Q->rear == p) {
Q->rear = Q->front;
}
free(p);
return x;
}
// 判断队列是否为空,若不空输出队头元素
void GetHead(LinkQueue *Q) {
if (Q->front == Q->rear) {
printf("队列为空\n");
return;
}
printf("队头元素为: %d\n", Q->front->next->data);
}
// 输出队列中所有元素
void PrintQueue(LinkQueue *Q) {
QueuePtr p = Q->front->next;
while (p) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
LinkQueue Q;
InitQueue(&Q);
int choice, x, length;
while (1) {
printf("1. 插入元素\n2. 删除队头元素\n3. 判断队列是否为空并输出队头元素\n4. 输出队列中所有元素\n0. 退出\n");
scanf("%d", &choice);
switch (choice) {
case 1:
printf("请输入要插入的元素: ");
scanf("%d", &x);
EnQueue(&Q, x);
break;
case 2:
printf("删除的队头元素值为: %d\n", DeQueue(&Q));
break;
case 3:
GetHead(&Q);
break;
case 4:
printf("队列中的元素为: ");
PrintQueue(&Q);
break;
case 0:
DestroyQueue(&Q);
exit(0);
default:
printf("无效的选项\n");
}
}
return 0;
}