一、实验目的
加深对抽象数据类型ADT栈和队列的理解;
二、实验原理
参照课本p.64-66,及Figure3.39-3.44;
课本p.82-83,及Figure3.57-3.60.
三、实验内容
编写程序实现ADT栈的定义,及常用操作(数组或指针实现):
- 生成栈;
- Push
- Pop
编写程序实现ADT队列的定义,及常用操作:
- 生成队列;
- Enqueues入列;
- IsEmpty判断是否队列为空。
四、实验要求
- 实现ADT栈的结构及操作;
- 实现ADT队列的结构及操作,并给出应用。
五、实验源程序
- ADT栈实验代码
ADTStack.h 头文件
1 2 3 4 5 6 7 8 9 10 11 12
| #ifndef _ADTStack_H struct Node; typedef struct Node *PtyToNode; typedef PtyToNode Stack;
Stack CreatStack(); void PushStack(int X, Stack S); void PopStack(Stack S); int GetTop(Stack S); void GetAll(Stack S);
#endif
|
ADTStack.c 主程序文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
| #include <stdio.h> #include<stdlib.h> #include <ADTStack.h> #define MaxSize 100 struct Node { int *base; int *top; int stacksize; };
Stack CreatStack() { Stack S = (Stack)malloc((sizeof(struct Node))); S->base = (int *)malloc(MaxSize); if(!S->base) printf("栈初始化失败!"); S->top = S->base; printf("栈初始化成功!\n"); return S; }
void PushStack(int X,Stack S) { if(S->top-S->base==S->stacksize) printf("栈已满!"); else{ S->top++; *(S->top) = X; } }
void PopStack(Stack S) { if(S->top==S->base) printf("栈为空!"); else { printf("栈顶值为%d,已取出\n", *(S->top)); S->top--; } }
int GetTop(Stack S) { if(S->top==S->base) { printf("栈为空!\n"); return 0; } return *(S->top); }
void GetAll(Stack S) { int i; if(S->top==S->base) printf("栈为空!\n"); else { printf("栈内数据如下:\n"); i = S->top-S->base; for(int j = 0; j < i; j++) { printf("%d\n",*(S->top-j)); } } }
int main(void) { int temp,pushnum,popnum,value; Stack S = CreatStack(); while (1) { printf("请选择要进行的操作:1.压栈 2.出栈 3.读栈顶 4.读栈\n"); scanf_s("%d", &temp); switch (temp) { case 1: printf("请输入要压入栈数据的个数:"); scanf_s("%d", &pushnum); printf("\n"); for (int n = 0; n < pushnum;n++) { printf("请输入要压入栈的数据:"); scanf_s("%d", &value); PushStack(value, S); printf("\n"); } break; case 2: printf("请输入要出栈数据的个数:"); scanf_s("%d", &popnum); printf("\n"); for (int n = 0; n < popnum; n++) PopStack(S); break; case 3: printf("当前栈顶数据为:%d\n", GetTop(S)); break; case 4: GetAll(S); break; default: break; } } }
|
- ADT队列代码
ADTArray.h 头文件
1 2 3 4 5 6 7 8 9 10 11
| #ifndef _ADTArray_H struct Node; typedef struct Node *PtyToNode; typedef PtyToNode Array;
Array CreatArray(); int IsEmpty(Array A); void EnterArray(Array A,int X);
#endif
|
ADTArray.c 主程序文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
| #include <ADTArray.h> #include <stdio.h>
struct Node { int data[100]; int front; int behind; int size; };
Array CreatArray() { Array A = (Array)malloc(sizeof(struct Node)); A->front = 0; A->behind = 0; A->size = 0; printf("初始化队列成功!\n"); return A; }
int Isempty(Array A) { return A->size == 0; }
void EnterArray(Array A,int X) { A->data[A->behind] = X; A->behind++; A->front = A->behind-1; A->size++; }
void PrintArray(Array A) {
printf("当前队列为:\n"); for(int i = 0; i < A->size; i++) printf("%d\n", A->data[i]); }
int main(void) { int i,temp,n,c; Array A = CreatArray(); while (1) { printf("请选择要进行的操作:1.入列 2.显示队列 3.判断队列是否为空\n"); scanf_s("%d", &temp); switch (temp) { case 1: printf("请输入需要入列的数据个数:"); scanf_s("%d", &n); printf("\n"); for (i = 0; i < n; i++) { printf("请输入需要入列的数据:"); scanf_s("%d", &c); EnterArray(A, c); printf("\n"); } printf("入列完成!\n"); break; case 2: PrintArray(A); break; case 3: if (IsEmpty(A)) printf("该队列为空队列!\n"); else printf("该队列不是空队列!\n"); break; } } }
|
六、实验结果
- ADT栈实验结果
检验生成栈函数CreatStack的功能:

栈生成成功!
检验压栈函数PushStack的功能:

压栈操作成功!
检验出栈函数PopStack的功能:

出栈操作成功!
检验读栈顶函数GetTop的功能:

读取栈顶操作成功!
至此,ADT栈的基本操作均已完成,功能基本完善!
- ADT列表实验结果
检验生成队列函数CreatArray的功能:

生成队列成功!
检验入列函数EnterArray的功能:

入列操作成功!
检验判断队列是否为空的函数Isempty的功能:

判断队列是否为空的结果正确!
至此,ADT队列的基本功能皆已实现。