数据结构 实验二 栈
首先,头文件与实验一相同,这里就不再赘述。可以参考实验一的头文件。
栈操作的相关实验代码:
#include <stdio.h> #include <stdlib.h> /*包含数据结构的预定义常量和类型P10 */ #include "DataHead.h" /*文件名大于8位出错*/ /*定义元素类型为整数类型*/ typedef int SElemType; /*栈的顺序存储表示*/ #define STACK_INIT_SIZE 4 /* p46 */ #define STACKINCREMENT 1 typedef struct{ SElemType *base; SElemType *top; int stacksize; }SqStack; /*函数申明*/ Status InitStack(SqStack *L); /* p47 */ Status GetTop(SqStack S,SElemType *e); Status Push(SqStack *L, SElemType e); /* 进栈,插入 */ Status Pop(SqStack *L, SElemType *e); /* 出栈,删除*/ void Out_Stack(SqStack L); /*补充,输出打印栈*/ /*主函数*/ void main() { int i,k,loc; /* k ,菜单控制变量*/ SElemType e,x; char ch; SqStack L; SqStack *p; system("graftabl 936");/*调用MS_DOS中文支持*/ p=&L;/*p指向 L*/ do{ printf(" ========实验二:栈和队列 ==============="); printf(" 1.建立栈:构造一个空栈,并插入元素"); printf(" 2.入栈,插入元素"); printf(" 3.出栈,删除元素"); printf(" 4.取栈顶元素"); printf(" 5.输出显示栈内元素,从栈底到栈顶"); printf(" 0.结束程序运行"); printf(" ====================================="); printf(" 请输入您的选择(1,2,3,4,0) "); scanf("%d",&k); switch(k) { case 1:{loc=InitStack(p); printf(" 请输入入栈元素个数,并依次输入整数类型的元素值"); scanf("%d",&loc); for(i=1;i<=loc;i++) { scanf("%d",&e); Push(p, e); /*也可以不处理函数返回值*/ } Out_Stack(L); }break; case 2:{ printf(" 请输入入栈元素的值:"); scanf("%d", &e); Push(p,e); Out_Stack(L); }break; case 3: { printf(" 请输入出栈元素个数"); while(true) { scanf("%d", &loc); if(loc > p->top-p->base) printf(" !!出栈元素个数大于栈内所有元素个数!请重新输入! "); else break; } printf(" 出栈元素为: "); for(i = 1; i <= loc; i++) { Pop(p, &e); printf("%8d ", e); } Out_Stack(L); }break; case 4: { GetTop(L, &e); printf("当前栈顶元素为: %d", e); }; break; case 5:{Out_Stack(L); }; break; case 0:{exit(0);} } }while(k!=0); ch =getchar(); } Status InitStack(SqStack *S) { /* p47 */ /* 构造一个空栈 */ S->base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType)); if (!S->base) exit(OVERFLOW); /* 存储分配失败 */ S->top = S->base; S->stacksize = STACK_INIT_SIZE; /* 初始存储容量 */ return OK; } /* InitStack */ Status GetTop(SqStack S, SElemType *e) { /* p47 */ if(S.base == S.top) return ERROR; e = S.top - 1; return OK; } /* GetTop */ Status Push(SqStack *S, SElemType e) { /* P47 */ if (S->top-S->base >= S->stacksize) { /* 当前存储空间已满,增加容量 */ S->base = (SElemType *)realloc(S->base, (S->stacksize+STACKINCREMENT)*sizeof (SElemType)); if (!S->base) exit(OVERFLOW); /* 存储分配失败 */ S->top = S->base+S->stacksize; S->stacksize += STACKINCREMENT; /* 增加存储容量 */ } *S->top++ = e; /* 个人的一些补充说明:由于栈中的top指针指向栈中即将赋值的空闲存储地址,所以先将e的值赋给top指针所指向的存储空间,然后再将top指针向后移动一位*/ return OK; } /* Push */ void Out_Stack(SqStack L){ int *i; printf(" 当前栈内元素从栈底到栈顶为:"); for(i=L.base;i<L.top;i++) printf("%10d",*i); } Status Pop(SqStack *S, SElemType *e) { /* p47 */ if(S->base == S->top) return ERROR; *e = *--S->top; return OK; } /* Pop */
可以复制上述代码,也可以去我的网盘下载cpp源文件。