C语言数据结构实验代码如下:
//顺序栈基本操作的实现
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define MAXSIZE 3
#define STACK_INCREMENT 10
typedef struct SqStack {
int* base;
int* top;
int size;
}SqStack;
//声明一个栈
SqStack S;
//初始化顺序栈
void CreatStack() {
//创建一个指定空间大小的顺序栈
S.base = (int*)malloc(MAXSIZE * sizeof(int));
//判断是否创建成功
if (!S.base) {
printf("栈创建有误\n");
return;
}
S.top = S.base;
S.size = MAXSIZE;
}
//顺序栈扩容
int StackExpansion() {
//对当前顺序栈进行扩容
int* newstack = (int*)malloc((S.size + STACK_INCREMENT) * sizeof(int));
//判断是否扩容成功
if (newstack == NULL) {
printf("顺序栈扩容失败\n");
return 1;//扩容失败返回1
}
for (int i = 0; i < S.size; i++) {
newstack[i] = S.base[i];
}
S.base = newstack;
S.top = S.base + S.size;
S.size += STACK_INCREMENT;//更新顺序栈大小
return 0;//扩容成功返回0
}
//顺序栈依次入栈操作
void InitStack() {
//默认输入-1为顺序栈结束的标志
printf("请输入元素:");
int temp;
scanf("%d", &temp);
int i = 0;//定义一个记录当前顺序栈元素个数计数器
//判断是否输入结束
while (temp != -1) {
//判断当前顺序栈是否已满
if (i >= S.size) {
if (StackExpansion()) {
//判断是否扩容成功
return;
}
}
S.base[i] = temp;
S.top = S.base + i + 1;//更新栈顶指针
i++;//更新计数器
scanf("%d", &temp);
}
}
//依次打印出栈元素
void PrintStack() {
//判断顺序栈是否为空
if (S.base == S.top) {
printf("顺序栈为空\n");
return;
}
printf("当前栈依次出栈为:");
int* temp = S.top;//定义一个储存栈顶指针的临时变量
while (temp - S.base > 0) {
temp--;
printf("%d ", *temp);
}
}
//插入指定元素为新的栈顶元素
void Push() {
printf("请输入所插入的新的栈顶元素:");
int num;
scanf("%d", &num);
//判断当前顺序栈是否已满
if ((S.top - S.base) > S.size) {
if (StackExpansion()) {
return;
}
}
*S.top = num;
S.top++;//更新变量
}
//删除栈顶元素,并输出所删除的元素
void Pop() {
//判断顺序栈是否为空
if (S.base == S.top) {
printf("顺序栈为空,删除操作有误\n");
return;
}
//改变栈顶指针的位置,以达到删除的目的
S.top--;
printf("栈顶元素已删除,该元素为:%d\n", *S.top);
}
//判断当前的栈是否为空栈
void StackEmpty() {
if (S.base == S.top) {
printf("顺序栈为空\n");
}
else {
printf("顺序栈不为空\n");
}
}
//菜单
void menu() {
printf("------------顺序栈基本操作的实现------------\n");
printf("1.建立一个顺序栈\n");
printf("2.退出菜单\n");
printf("请输入你所选择的操作数:");
int i = 0;
while (1) {
scanf("%d", &i);
switch (i) {
case 1:
CreatStack();
InitStack();
PrintStack();
break;
case 2:
printf("--------------------------------------------");
return;
default:
printf("\n输入的操作数有误,请重新输入:");
}
if (i == 1) {
break;
}
}
while (1) {
printf("\n");
printf("1.插入指定元素为新的栈顶元素\n");
printf("2.删除栈顶元素,并输出所删除的元素\n");
printf("3.判断当前的栈是否为空栈\n");
printf("4.依次打印出栈元素\n");
printf("5.退出菜单\n");
printf("请输入你所选择的操作数:");
scanf("%d", &i);
switch (i) {
case 1:
Push();
PrintStack();
break;
case 2:
Pop();
PrintStack();
break;
case 3:
StackEmpty();
break;
case 4:
PrintStack();
break;
case 5:
printf("--------------------------------------------");
return;
default:
printf("\n输入的操作数有误,请重新输入:");
}
}
}
//菜单运行
int main() {
menu();
}
ps.陕理工22级数据结构第二次实验记录