printf("出栈元素为:[%d],栈内元素为:ln",i);outputstack(s,top):)elseprintf("栈空\n");break;11(二)设计实验1、利用栈的基本操作实现将任意一个十进制整数转化为R进制整数算法为:(1)定义栈的顺序存取结构(2)分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等)(3)定义一个函数用来实现上面问题:十进制整数X和R作为形参初始化栈只要X不为0重复做下列动作将X%R入栈X=X/R只要栈不为空重复做下列动作栈顶出栈输出栈顶元素2、调用栈的基本操作函数实现下列操作:假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个判别表达式中括号是否正确配对的函数correct(char*exp,intmax),其中传入参数为表达式和表达式长度。实验程序:1、#defineMAXSIZE100#include<stdlib.h>22
22 printf("出栈元素为:[%d],栈内元素为:\n",i); outputstack(s,top);} else printf("栈空\n"); break; } } } (二)设计实验 1、利用栈的基本操作实现将任意一个十进制整数转化为 R 进制整数 算法为: (1)定义栈的顺序存取结构 (2)分别定义栈的基本操作(初始化栈、判栈为空、出栈、入栈等) (3)定义一个函数用来实现上面问题: 十进制整数 X 和 R 作为形参 初始化栈 只要X不为0重复做下列动作 将X%R入栈 X=X/R 只要栈不为空重复做下列动作 栈顶出栈 输出栈顶元素 2、调用栈的基本操作函数实现下列操作: 假设一个算术表达式中包含圆括号、方括号和花括号三种类型的括号,编写一个 判别表达式中括号是否正确配对的函数 correct(char *exp,int max),其中传入参数为 表达式和表达式长度。 实验程序: 1、#define MAXSIZE 100 #include<stdlib.h>
#include<conio.h>struct stacklint data[MAXSIZE];int top,3;void init(struct stack *s)s->top=-1;int empty(struct stack *s)if(s->top==-1)return 1;elsereturn O,1void push(struct stack *s,int i)if(s->top==MAXSIZE-1)printf("Stack is ful\n");return,1s->top++;s->data[s->top]=i;int pop(struct stack *s)if(empty(s)(printf("stack is empty");return -1;1return(s->data[s->top--]);23
23 #include<conio.h> struct stack{ int data[MAXSIZE]; int top; }; void init(struct stack *s){ s->top=-1; }int empty(struct stack *s){ if(s->top==-1) return 1; else return 0; }void push(struct stack *s,int i){ if(s->top==MAXSIZE-1){ printf("Stack is full\n"); return; }s->top++; s->data[s->top]=i; }int pop(struct stack *s){ if(empty(s)){ printf("stack is empty"); return -1; }return(s->data[s->top-]); }
void trans(int num)(struct stack s;int k,init(&s);while(num)(k=num%16;push(&s,k);num=num/16;while(!empty(&s)k=pop(&s);if(k<10)printf("%d",k);elseprintf("%c",k+55);3printf("In");mainOint num;system("cls");printf("Input a num,-1 to quit:In")scanf("%d",&num);while(num!=-1)(trans(num),scanf("%d",&num);12、#include<stdio.h>24
24 void trans(int num){ struct stack s; int k; init(&s); while(num){ k=num%16; push(&s,k); num=num/16; } while(!empty(&s)){ k=pop(&s); if(k<10) printf("%d",k); else printf("%c",k+55); } printf("\n"); } main(){ int num; system("cls"); printf("Input a num,-1 to quit:\n"); scanf("%d",&num); while(num!=-1){ trans(num); scanf("%d",&num); } } 2、#include<stdio.h>
#defineMAXN50int push(int *stack,int maxn,int *toppt,int x)(if(*toppt>=maxn)return 1;stack[*toppt]=x;++(*toppt);return O;int pop(int *stack,int *toppt,int *cp)if(*toppt==0)return 1;--(*toppt);*cp=stack[*toppt];return 0;)int correct(char *exp,int max)int flag=0;char s[MAXN];int top=0;char c,int i,for(i=0,i<max&&flag--0,i++)if(exp[]--(llexp[]-[llexp[i]--"()push(s,MAXN,&top,exp[i]);if(exp[i]=)llexp[i]"llexp[i]=)(flag=pop(s,&top,&c);if(exp[]=)&&c!=()l(exp[i]=T&&c!=[)I(exp[]==&&c!=))25
25 #define MAXN 50 int push(int *stack,int maxn,int *toppt,int x) {if(*toppt>=maxn) return 1; stack[*toppt]=x; ++(*toppt); return 0; } int pop(int *stack,int *toppt,int *cp) { if(*toppt==0) return 1; -(*toppt); *cp=stack[*toppt]; return 0;} int correct(char *exp,int max) { int flag=0; char s[MAXN]; int top=0; char c; int i; for(i=0;i<max&&flag==0;i++){ if(exp[i]=='('||exp[i]=='['||exp[i]=='{') push(s,MAXN,&top,exp[i]); if(exp[i]==')'||exp[i]==']'||exp[i]=='}'){ flag=pop(s,&top,&c); if((exp[i]==')'&&c!='(')||(exp[i]==']'&&c!='[') ||(exp[i]=='}'&&c!='{'))
flag=1;1if(top!=0)flag=l;return flag,void mainO char s[MAXN],c;char exp[1024];int top=0;while(1)(printf("请输入表达式,输入0退出:");gets(exp);exp[MAXN]=10';if(strcmp(exp,"0")==0)return;if(correct(exp,strlen(exp)!=0)printf("表达式内容为:In%sln表达式括号不匹配n",exp);elseprintf("表达式括号匹配\n"),11三、思考题1、读栈顶元素的算法与退栈顶元素的算法有何区别?2、如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。如何解决这个问题?26
26 flag=1; } } if(top!=0) flag=1; return flag; } void main() { char s[MAXN],c; char exp[1024]; int top=0; while(1){ printf("请输入表达式,输入 0 退出:"); gets(exp); exp[MAXN]='\0'; if(strcmp(exp,"0")==0) return; if(correct(exp,strlen(exp))!=0) printf("表达式内容为:\n%s\n 表达式括号不匹配\n",exp); else printf("表达式括号匹配\n"); } } 三、思考题 1、读栈顶元素的算法与退栈顶元素的算法有何区别? 2、如果一个程序中要用到两个栈,为了不发生上溢错误,就必须给每个栈预先分配 一个足够大的存储空间。若每个栈都预分配过大的存储空间,势必会造成系统空间紧张。 如何解决这个问题?