目前大一新生在读 学习数据结构时遇到了问题 还希望能得到大神们的解答

Wissssy 2021-04-12 09:59:13
我把我的发帖链接放在这里 由于不知道怎么在这里写出来 就直接把帖子放这里了 还望大神指点
https://blog.csdn.net/m0_55651395/article/details/115643222?spm=1001.2014.3001.5501
...全文
162 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Wissssy 2021-04-14
  • 打赏
  • 举报
回复
我真不知道你这个赵四老师回复我的内容有何意义 我只能理解为水帖
赵4老师 2021-04-14
  • 打赏
  • 举报
回复
我以为你已经到了没有编译错误,正在调试运行时逻辑错误的阶段; 实际上你还停留在编译错误阶段。 以下给出编译无错的单个源文件版(单个源文件相比头文件+源文件两个文件比较好调试):
//stack.h {
#include<string.h>
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int Boolean;
#define STACK_INIT_SIZE 10
#define STACK_INCREMENT 2
typedef int Selemtype;
struct Sqstack
{
	Selemtype *base;
	Selemtype *top;
	int	stacksize;
};
void 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;
}//顺序栈初始化
void DestroyStack(Sqstack &s)
{
	free(s.base);
	s.top =	s.base = NULL;
	s.stacksize=0;
 } //销毁栈
void ClearStack(Sqstack &s)
{
	s.top=s.base;
 } //重置栈
int StackEmpty(Sqstack &s)
{
	if(s.top==s.base)
		return OK;
	else
		return ERROR;
 } //判断栈空
int StackLenth(Sqstack &s){
	return s.top-s.base;
} //求栈长
int Getelem(Sqstack &s,Selemtype &e){
	if(s.top>s.base){
		e=*(s.top-1);
		return OK;
	}
	else
		return ERROR;
} //取栈顶元素
void Push(Sqstack &s,Selemtype e){
	if(s.top-s.base==s.stacksize)
	{
		s.base=(Selemtype*)realloc(s.base,(s.stacksize+STACK_INCREMENT)*sizeof(Selemtype));
		if(s.base)
			exit(OVERFLOW);
		s.top=s.base+s.stacksize;
		s.stacksize+=STACK_INCREMENT;
	}
	*(s.top)++ = e;
}//压栈
int Pop(Sqstack &s,Selemtype &e)
{
	if(s.top==s.base){
		return ERROR;
	}
	e =	* --s.top;
	return OK;
 } //出栈
void StackTraverse(Sqstack &s,void(*visit)(Selemtype)){
	Selemtype *p = s.base;
	while(s.top>p)
		visit(*p++);
	printf("\n");
}
char Precede(Selemtype t1,Selemtype t2)
{
	char f;
	switch(t2) {
		case '+':
		case '-':
			if(t1=='('||t1=='\n')
				f='<';
			else
				f='>';
				break;
		case '*':
		case '/':
			if(t1=='*'||t1=='/'||t1==')')
				f='>';
			else
				f='<';
			break;
		case '(':
			if(t1==')') {
				printf("括号不匹配");
				exit(OVERFLOW);
			}
			else
				f='<';
			break;
		case ')':
			switch(t1) {
				case '(':
					f= '=';
					break;
				case '\n':
					printf("缺乏左括号");
					exit(OVERFLOW);
				default:
					f='>';
			}
			break;
		case '\n':
			switch(t1) {
				case '\n':
					f= '=';
					break;
				case '(':
					printf("缺乏右括号\n");
					exit(OVERFLOW);
				default:
					f='>';
			}

	}
	return f;
}//符号优先级
int In(Selemtype c)
{
	switch(c)
	{
		case '+':
		case '-':
		case '*':
		case '/':
		case '(':
		case ')':
		case '\n':return TRUE;
		default:return FALSE;
	}
}//判断符号
int Operate(Selemtype a,Selemtype th,Selemtype b)
{
	switch(th)
	{
		case '+':
			return a+b;
		case '-':
			return a-b;
		case '*':
			return a*b;
	}
	return a/b;
 }

//stack.h }
//main.cpp {
//#include"stack.h"
int Evaluate() {
	Sqstack	OPTR,OPND;
	int	a,b,d,x;
	char c;
	InitStack(OPTR);
	InitStack(OPND);
	Push(OPTR,'\n');
	c=getchar();
	Getelem(OPTR,x);
	while(c!='\n'||x!='\n') {
		if(In(c))
			switch(Precede(x,c)) {
				case'<':
					Push(OPTR,c);
					c=getchar();
					break;
				case'=':
					Pop(OPTR,x);
					c=getchar();
					break;
				case'>':
					Pop(OPTR,x);
					Pop(OPND,b);
					Pop(OPND,a);
					Push(OPND,Operate(a,x,b));
			}
		else if(c>='0'&&c<='9') {
			d=0;
			while(c>='0'&&c<='9') {
				d=d*10+c-'0';
				c=getchar();
			}
			Push(OPND,d);
		} else {
			printf("出现非法字符!\n");
			exit(OVERFLOW);
		}
		Getelem(OPTR,x);
	}
	Pop(OPND,x);
	if(!StackEmpty(OPND)) {
		printf("表达式不正确!");
		exit(OVERFLOW);
	}
	return x;
}
int main(){
	printf("请输入算数表达式,负数要用(0-正数)表示\n");
	printf("%d\n",Evaluate());
    return 0;
}

//main.cpp }
请在此版本上在IDE中调试吧。 等你依赖IDE的变量值显示功能调试不得要领后,再参考下面的话 ★不要依赖调试器输出复杂数据结构!而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出,非常有助于调试!或者可以说是“基础设施” 和我上面的回帖。
forever74 2021-04-14
  • 打赏
  • 举报
回复
所以,四老师把渔贴收回,把水拧干,直接上鱼吧。
赵4老师 2021-04-13
  • 打赏
  • 举报
回复
将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出,非常有助于调试!或者可以说是“基础设施” 参考: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧