实验二 栈和队列的应用

举报
谙忆 发表于 2021/05/28 06:00:54 2021/05/28
【摘要】 实验目的 本次实验的目的在于使学生深入了解栈和队列的特征,掌握在实际问题背景下的灵活运用。 实验要求 正确设计和实现本程序,记录输出结果。 实验内容 1.队列的各种基本操作实现。 2.十进制数向N进制数据的转换。(栈的应用) 附:代码 #include <stdio.h> #include <string.h> #include <stdlib.h> #...

实验目的
本次实验的目的在于使学生深入了解栈和队列的特征,掌握在实际问题背景下的灵活运用。
实验要求
正确设计和实现本程序,记录输出结果。
实验内容
1.队列的各种基本操作实现。
2.十进制数向N进制数据的转换。(栈的应用)

附:代码

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define OVERFLOW 0
#define OK 1
#define ERROR 0
//顺序栈的定义
#define STACK_INIT_SIZE 100//存储空间初始分配量
#define STACKINCREMENT 20
//存储空间分配增量
typedef int SElemType;
 //SElemType可以是任何相应的数据类型如int,float或char
typedef struct{ SElemType*base; //*base指向数组向量 SElemType*top; int stacksize; //栈的当前可使用的最大容量
}SqStack;
//-------------------------
//初始化顺序栈
int InitStack(SqStack *S){ //在此插入必要的语句 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;
}
//------------------------
//插入元素e为新的栈顶元素
void Push(SqStack *S,SElemType e){ //栈满,追加存储空间 //printf("####%d ",e); 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 = S->stacksize + STACKINCREMENT; } *(S->top)++ = e; //printf("****%d ",e);
}
//---------------------
int Pop(SqStack *S){//若栈不空,则删除S的栈顶元素,并将其值返回。若栈空,返回ERROR //若栈不空,则删除栈顶元素,用e返回其值 if(S->top==S->base) return ERROR; return *--(S->top);
}
//--------------
void PrintStack(SqStack *S){//顺序打印栈内元素值 int k; for(k=0;k<S->top-S->base;k++) printf("%d",S->base[k]);
}
int main(){ SqStack *S; int i,e,n; /**(初始化)函数申明 int InitStack(SqStack &S); //(进栈)函数申明 void Push(SqStack &S,SelemType e); //(出栈)函数申明 int Pop(SqStck &s); //(打印站内数据)函数申明 void PrintStack(SqStack &S); //初始化栈 **/ printf("进栈元素数量n\n"); int n1; scanf("%d",&n1); n=n1; InitStack(S); //欲建立的顺序表长度,调试阶段用指定数据,调试完后改用scanf() // //scanf("%d",&n); printf("请输入%d个时栈元素值:",n); for(i=1;i<=n;i++){ scanf("%d",&e); Push(S,e); } printf("进栈元素依次如下:\n"); PrintStack(S); printf("\n"); //欲出栈元素个数,调试阶段用指定数据,调试完后赋值 n=2; //printf("出栈元素数量n\n"); //scanf("%d",&n); printf("\n出栈元素值依次为:\n"); for(i=1;i<=n;i++){ e=Pop(S); if(e) printf("%d",e); } printf("\n"); printf("栈内元素为 : \n"); PrintStack(S);
}

  
 
  • 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

二进制转换为十进制代码(栈的实现):
请用c:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
typedef char ElemType ;
typedef struct{ ElemType *base; ElemType *top; int stacksize;
}sqStack;

initStack(sqStack *s){ ///内存中开辟一段连续空间作为栈空间,首地址赋值给s->base s->base=(ElemType *)malloc(STACK_INIT_SIZE *sizeof(ElemType)); if(!s->base) exit(0);///分配空间失败 s->top = s->base; ///最开始,栈顶就是栈底 s->stacksize = STACK_INIT_SIZE;
}
Push(sqStack *s,ElemType e){ if(s->top - s->base >= s->stacksize){ ///栈满,追加空间 s->base =(ElemType *)realloc(s->base,(s->stacksize+STACKINCREMENT)*sizeof(ElemType)); ///分配失败 if(!s->base)exit(0); s->top=s->base+s->stacksize; ///设置栈的最大容量 s->stacksize=s->stacksize + STACKINCREMENT ; } *(s->top)=e; ///放入数据 s->top++; ///top指向下个地址
}
int StackLen(sqStack s){ return (s.top-s.base);
}
Pop(sqStack *s,ElemType *e){ if(s->top==s->base) return ; *(s->top--); *e=*(s->top); ///*e=*--s->top;
}
DestroyStack(sqStack *s){ free(s->base); ///释放掉内存空间 s->base = s->top = NULL; ///栈底栈顶指针置NULL s->stacksize = 0; ///设置栈的最大容量为0
}

int main(){ ElemType c; sqStack s; int len,i,sum=0; printf("Please input a Binary digit(输入二进制数,以‘#’结束):\n"); initStack(&s); ///创建一个栈,用来存放二进制字符串 ///输入0/1字符表示的二进制数,以#结束 scanf("%c",&c); while(c!='#'){ Push(&s,c); scanf("%c",&c); } getchar(); ///得到栈中的元素个数,即二进制数的长度 len = StackLen(s); for(i=0;i<len;i++){ Pop(&s,&c); sum+=(c-48)*pow(2,i); ///转换为十进制 } printf("Decimal is %d\n",sum); DestroyStack(&s); ///释放栈空间 getchar();
}

  
 
  • 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

文章来源: chenhx.blog.csdn.net,作者:谙忆,版权归原作者所有,如需转载,请联系作者。

原文链接:chenhx.blog.csdn.net/article/details/49592525

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。