源代码的调试

#include "stdio.h"
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
typedef int datatype;
typedef struct {  /*顺序栈的结构体类型定义*/
	datatype stack[MAXSIZE];
	int top;
} seqstack;

void setnull(seqstack *s) { /*置空栈-由于c语言的数组下标是从0开始的,所以置空栈操作时将栈顶指针放在下标为0之前,即-1处。*/
	s->top=-1;
}
int empty(seqstack *s) { /*判断当前栈是否为空栈*/
	if(s->top<0)
		return TRUE;
	else
		return FALSE;
}

int push(seqstack *s,datatype x) { /*把元素x压入栈s中*/
	if(s->top>=MAXSIZE-1) {
		printf("stack overflow!\n"); /*发生上溢*/
		return FALSE;
	} else {
		s->stack[++s->top]=x; /*栈顶指针上移,数据元素入栈*/
		return TRUE;
	}
}

datatype pop(seqstack *s) { /*弹出当前栈s的栈顶元素*/
	if(s->top<0) {
		printf("stack empty!\n"); /*栈空,返回空值*/
		return NULL;
	} else {
		s->top--;
		return(s->stack[s->top+1]);
	}/*由于return语句的特点,必须先使top减1,然后再执行return语句。而此时栈顶元素的表示应该为s->top+1.*/

}
int judge(seqstack *s) { /*括号匹配检查算法。--遇到"("、"["、"{"时,将其压入栈s中。*/
	datatype symb,ch,store;
	push(s,'#');
	symb=getchar();/*从键盘接受字符*/
	while(symb!='#') {
		switch(symb) {
			case '(':
			case '[':
			case '{':
				push(s,symb);
				break;
			case ')':
				ch=pop(s);
				if(ch!='(') return FALSE;
				break;
			case ']':
				ch=pop(s);
				if(ch!='[') return FALSE;
				break;
			case '}':
				ch=pop(s);
				if(ch!='{') return FALSE;
				break;
			default:
				;
		}
		symb=getchar();
	}
	if(pop(s)=='#') return TRUE;
	else return FALSE;
}

main() {
	seqstack q;
	setnull(&q);
	printf("please input an express end with symbol '#':\n");
	if(judge(&q)) printf("yes\n");  /*括号匹配,则输出yes*/
	else          printf("no\n");   /*括号不匹配,则输出no*/
}


在DEVC++中调试的时候会出现NULLredifined,所以可将定义NULL这一行删去。输入的时候记得输入的是英文括号

假定表达式不是通过getchar()函数一个个传送的,而是存放在一个字符数组A[n]中,程序需要做哪些改变; 在judge()函数中,如果不用switch()函数,你会怎么处理?

#include "stdio.h"
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#include<string.h>
#define n 100
typedef int datatype;
typedef struct {  /*顺序栈的结构体类型定义*/
	datatype stack[MAXSIZE];
	int top;
} seqstack;

void setnull(seqstack *s) { /*置空栈-由于c语言的数组下标是从0开始的,所以置空栈操作时将栈顶指针放在下标为0之前,即-1处。*/
	s->top=-1;
}
int empty(seqstack *s) { /*判断当前栈是否为空栈*/
	if(s->top<0)
		return TRUE;
	else
		return FALSE;
}

int push(seqstack *s,datatype x) { /*把元素x压入栈s中*/
	if(s->top>=MAXSIZE-1) {
		printf("stack overflow!\n"); /*发生上溢*/
		return FALSE;
	} else {
		s->stack[++s->top]=x; /*栈顶指针上移,数据元素入栈*/
		return TRUE;
	}
}

datatype pop(seqstack *s) { /*弹出当前栈s的栈顶元素*/
	if(s->top<0) {
		printf("stack empty!\n"); /*栈空,返回空值*/
		return NULL;
	} else {
		s->top--;
		return(s->stack[s->top+1]);
	}/*由于return语句的特点,必须先使top减1,然后再执行return语句。而此时栈顶元素的表示应该为s->top+1.*/

}
int judge(seqstack *s) {
	datatype symb,ch,store;
	char A[n];
	gets(A);
	push(s,'#');
	int i;
	for(i=0; A[i]!='#'; i++) {
		if (A[i]=='('||A[i]=='['||A[i]=='{')
			push(s,A[i]);
		if (A[i]==')') {
			ch=pop(s);
			if(ch!='(') return FALSE;
		}
		if (A[i]==']') {
			ch=pop(s);
			if(ch!='[') return FALSE;
		}
		if (A[i]=='}') {
			ch=pop(s);
			if(ch!='{') return FALSE;
		}
	}
	if(pop(s)=='#') return TRUE;
	else return FALSE;
}

main() {
	seqstack q;
	setnull(&q);
	printf("please input an express end with symbol '#':\n");
	if(judge(&q)) printf("yes\n");  /*括号匹配,则输出yes*/
	else          printf("no\n");   /*括号不匹配,则输出no*/
}

分析思考题

#include "stdio.h"
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
typedef int datatype;
typedef struct {  /*顺序栈的结构体类型定义*/
	datatype stack[MAXSIZE];
	int top;
} seqstack;

void setnull(seqstack *s) { /*置空栈-由于c语言的数组下标是从0开始的,所以置空栈操作时将栈顶指针放在下标为0之前,即-1处。*/
	s->top=-1;
}
int empty(seqstack *s) { /*判断当前栈是否为空栈*/
	if(s->top<0)
		return TRUE;
	else
		return FALSE;
}

int push(seqstack *s,datatype x) { /*把元素x压入栈s中*/
	if(s->top>=MAXSIZE-1) {
		printf("stack overflow!\n"); /*发生上溢*/
		return FALSE;
	} else {
		s->stack[++s->top]=x; /*栈顶指针上移,数据元素入栈*/
		return TRUE;
	}
}

datatype pop(seqstack *s) { /*弹出当前栈s的栈顶元素*/
	if(s->top<0) {
		printf("stack empty!\n"); /*栈空,返回空值*/
		return NULL;
	} else {
		s->top--;
		return(s->stack[s->top+1]);
	}/*由于return语句的特点,必须先使top减1,然后再执行return语句。而此时栈顶元素的表示应该为s->top+1.*/

}
void transform(seqstack *s,int m,int n) {
	int x;
	while(m!=0) {
		int t=m%n;
		push(s,t);
		m=m/n;
	}
	while(empty(s)!=TRUE	) {
		x=pop(s);
		printf("%d",x);
	}
}

main() {
	char ch;
	int m,n;
	seqstack q;
	setnull(&q);
	/*printf("请输入一个十进制数m和要转换的进制数n:\n");*/
	scanf("%d %d",&m,&n);
	printf("将十进制数%d",m);
	printf("转换为%d进制\n",n); 
	transform(&q,m,n);/*调用进制转换函数进行调用*/
}

由于本人最近有点犯懒癌,而且本次题比较简单,所以直接一块就写了,注释也懒得写了(狗头)

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐