实验训练内容(包括实验原理和操作步骤): 编写程序,实现顺序栈的创建、进栈和出栈等基本操作算法。 (1)初始化顺序栈s。 (2)定义进栈操作,依次进栈元素1,3,5,7,9。 (3)取栈顶元素并输出。 (4)定义出栈操作,输出出栈序列。 (5)删除栈中值为给定值的元素。 (6)实现顺序栈s中元素的逆置。 (7)销毁顺序栈。
实验总结(包括实验数据分析、实验代码、实验结果、实验过程中出现的问题及解决方法等): 代码如下: |
#include <stdio.h> #include<malloc.h> #define OK 1 #define ERROR 0 #define OVERFLOW -1 #define MAXSIZE 100 typedef int SElemType;//将 整型 int 关键字 重新命名为 SElemtype typedef int status; typedef struct{ SElemType *base; SElemType *top; } SqStack; //(1)初始化顺序栈 status initstack(SqStack &S){ S.base=new SElemType[MAXSIZE]; //为顺序栈动态分配一个最大容量为MAXSIZE的数组空间 if(!S.base) return(OVERFLOW);//存储分配失败 S.top=S.base;//top初始为base,空栈 return OK; } //(2)进栈 status push(SqStack &S,SElemType e){ if((S.top-S.base)>=MAXSIZE) return ERROR; *S.top++=e;//元素e压入栈顶,栈顶指针加1 return OK; } //(3)取栈顶元素并输出 bool GetTop(SqStack S,SElemType &e){ if(S.top==S.base) return false; else e=*--S.top; printf("栈顶元素为%d\n",e); return true; } //输出栈的元素,当栈顶不等于栈底时,输出栈底的元素,并对栈底的地址加1。 void output(SqStack S){ while(S.top!=S.base){ printf("%d\n",*S.base); S.base++; } } //(4)定义出栈操作,输出出栈序列 status pop(SqStack &S,SElemType &e){ if(S.top==S.base) return 0; e=*--S.top;//栈顶指针减1,将栈顶元素赋给e printf("出栈的元素为%d\n",e); return 1; } //(5)删除栈中值为给定值的元素 //先定义一个数组,让栈顶减1 指向最后一个元素 //当最后一个元素不等于要找的元素时,栈顶-1,直到找到为止 //如果当栈顶等于栈底或栈顶等于0时 还没找到,则说明没有这个元素,查找失败。 int deletely(SqStack &S,SElemType e){ int t,x=0; int a[MAXSIZE]; *(--S.top); while (*(S.top)!=e){ a[x]=*(S.top)--; x++; if(*(S.top)==0){ printf("\n删除失败,栈中没有这个元素\n"); return 0; //if(*(S.top)==NULL) //printf("\n删除失败"); } } printf("\n删除成功"); for(int i=x-1;i>=0;i--) *S.top++=a[i]; } //(6)实现顺序栈s中元素的逆置 //先定义一个数组,让栈顶减1,指向最后一个元素,当栈顶不等于栈底时 //将元素 放进数组里面 直到将栈底放入最后一个元素 然后 再将数组重新放回栈里。 int Localinversion(SqStack S){ int a[MAXSIZE]; int x=0; *(--S.top); while(S.top!=S.base){ a[x]=*(S.top)--; x++; } a[x]=*S.top; for(int i=0;i<=x;i++){ *S.top++=a[i]; } } //(7)销毁顺序表 void DestroyStack(SqStack &S) { if(S.base){ free(S.base); //通常与申请内存空间的函数malloc()结合使用 //可以释放由 malloc()、calloc()、realloc() 等函数申请的内存空间。 S.base=NULL; S.top=NULL; /*while(S.top!=S.base){ free(NULL); S.base++;} */ } } int main(){ int e; SqStack sq; initstack(sq); push(sq,1); push(sq,3); push(sq,5); push(sq,7); push(sq,9); output(sq); GetTop(sq,e); pop(sq,e); printf("删除的元素为5\n"); deletely(sq,5); printf("删除后的栈的元素为\n"); output(sq); Localinversion(sq); printf("逆置后栈的元素为\n"); output(sq); DestroyStack(sq); return 0; } |
栈的基本操作
最新推荐文章于 2023-10-12 23:17:13 发布