在线等,求大神帮忙
程序如下(感觉没错误啊):
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 1000
double result, number1,number2;
int i, j,n,m,flag;
char operate,ch;
char val[100];
//操作数栈定义
typedef struct{
double *base;
double *top;
int stacksize;
}numstack;
//操作码栈定义
typedef struct{
char *base;
char *top;
char stacksize;
}pondstack;
//操作数栈初始化
int num_init(numstack &S)
{
S.base = (double *)malloc(STACK_INIT_SIZE*sizeof(double));
if (!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//操作码栈初始化
int pond_init(pondstack &S)
{
S.base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));
if (!S.base)exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//将操作码压入堆栈
int push_pond(pondstack &S, char c)
{
*S.top++ = c;
return OK;
}
//将操作数压入堆栈
int push_num(numstack &S, double number)
{
*S.top++=number;
return OK;
}
//将操作码弹出堆栈
int pop_pond(pondstack S)
{
char c;
if (S.top == S.base)return ERROR;
c = *--S.top;
return c;
}
//将操作数弹出堆栈
int pop_num(numstack S)
{
double e;
if (S.top == S.base)return ERROR;
e = *--S.top;
return e;
}
//取栈顶
int get_top(pondstack N)
{
char c;
if (N.top == N.base)return ERROR;
c = *(N.top - 1);
return c;
}
//判断对错
int judge(char c)
{
if (c =='-' || c == '*' || c == '/' || c == '+')flag = 1;//c为运算符时flag=1;
else flag = 0;
return OK;
}
//优先级判别
int change_opnd(char c)
{
switch (c)
{
case '-':
case '+':m= 1; break;
case '*':
case '/':m= 2; break;
default: printf("error");
}
return(m);
}
//简单计算+,-,*,/
int caculate(double numbe1,char operat,double numbe2)
{
if (operate == '+')
{
result = numbe1 + numbe2;
}
if (operat == '-')
{
result = numbe1 - numbe2;
}
if (operat == '*')
{
result = numbe1*numbe2;
}
if (operat == '/')
{
result = numbe1 / numbe2;
}
return result;
}
//语法检查并计算
int Make_str()
{
numstack num;
pondstack pond;
num_init(num);//操作数栈num
pond_init(pond);//操作码栈pond
//输入判断进栈
for (n = 0; val[n] != '='; n++)
{
judge(val[n]);
if (flag == 0)push_num(num, val[n]);
else
{
if (pond.top == pond.base)push_pond(pond, val[n]);
else
{
int x, y;
x = change_opnd(val[n]);
y = change_opnd(ch = get_top(pond));
if (x > y)push_pond(pond, val[n]);//栈顶元素优先权低,直接进栈
else//栈顶元素优先权高,退栈运算结果进栈
{
number1=pop_num(num );
operate=pop_pond(pond);
number2=pop_num(num);
push_pond(pond,caculate(number1, operate, number2));
}
}
}
}
while (pond.top != pond.base)
{
number1 = pop_num(num);
operate = pop_pond(pond);
number2 = pop_num(num);
push_pond(pond, caculate(number1, operate, number2));
}
result=pop_num(num);
cout << result;
return OK;
}
//主函数
void main()
{
cout << "*****************运算表达式判断及运算结果********************" << endl;
Make_str();
}
调试时错误:0x01226CB9 处有未经处理的异常(在 shiyan2.3.exe 中): 0xC0000005: 写入位置 0x0047A000 时发生访问冲突。
在*S.top++=number;这。。。。不懂啊,指针不对吗?
在线等,谢谢了
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define STACK_INIT_SIZE 1000
double result, number1,number2;
int i, j,n,m,flag;
char operate,ch;
char val[100];
//操作数栈定义
typedef struct{
double *base;
double *top;
int stacksize;
}numstack;
//操作码栈定义
typedef struct{
char *base;
char *top;
char stacksize;
}pondstack;
//操作数栈初始化
int num_init(numstack &S)
{
S.base = (double *)malloc(STACK_INIT_SIZE*sizeof(double));
if (!S.base)exit(OVERFLOW);
S.top=S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//操作码栈初始化
int pond_init(pondstack &S)
{
S.base = (char *)malloc(STACK_INIT_SIZE*sizeof(char));
if (!S.base)exit(OVERFLOW);
S.top = S.base;
S.stacksize = STACK_INIT_SIZE;
return OK;
}
//将操作码压入堆栈
int push_pond(pondstack &S, char c)
{
*S.top++ = c;
return OK;
}
//将操作数压入堆栈
int push_num(numstack &S, double number)
{
*S.top++=number;
return OK;
}
//将操作码弹出堆栈
int pop_pond(pondstack S)
{
char c;
if (S.top == S.base)return ERROR;
c = *--S.top;
return c;
}
//将操作数弹出堆栈
int pop_num(numstack S)
{
double e;
if (S.top == S.base)return ERROR;
e = *--S.top;
return e;
}
//取栈顶
int get_top(pondstack N)
{
char c;
if (N.top == N.base)return ERROR;
c = *(N.top - 1);
return c;
}
//判断对错
int judge(char c)
{
if (c =='-' || c == '*' || c == '/' || c == '+')flag = 1;//c为运算符时flag=1;
else flag = 0;
return OK;
}
//优先级判别
int change_opnd(char c)
{
switch (c)
{
case '-':
case '+':m= 1; break;
case '*':
case '/':m= 2; break;
default: printf("error");
}
return(m);
}
//简单计算+,-,*,/
int caculate(double numbe1,char operat,double numbe2)
{
if (operate == '+')
{
result = numbe1 + numbe2;
}
if (operat == '-')
{
result = numbe1 - numbe2;
}
if (operat == '*')
{
result = numbe1*numbe2;
}
if (operat == '/')
{
result = numbe1 / numbe2;
}
return result;
}
//语法检查并计算
int Make_str()
{
numstack num;
pondstack pond;
num_init(num);//操作数栈num
pond_init(pond);//操作码栈pond
//输入判断进栈
for (n = 0; val[n] != '='; n++)
{
judge(val[n]);
if (flag == 0)push_num(num, val[n]);
else
{
if (pond.top == pond.base)push_pond(pond, val[n]);
else
{
int x, y;
x = change_opnd(val[n]);
y = change_opnd(ch = get_top(pond));
if (x > y)push_pond(pond, val[n]);//栈顶元素优先权低,直接进栈
else//栈顶元素优先权高,退栈运算结果进栈
{
number1=pop_num(num );
operate=pop_pond(pond);
number2=pop_num(num);
push_pond(pond,caculate(number1, operate, number2));
}
}
}
}
while (pond.top != pond.base)
{
number1 = pop_num(num);
operate = pop_pond(pond);
number2 = pop_num(num);
push_pond(pond, caculate(number1, operate, number2));
}
result=pop_num(num);
cout << result;
return OK;
}
//主函数
void main()
{
cout << "*****************运算表达式判断及运算结果********************" << endl;
Make_str();
}
调试时错误:0x01226CB9 处有未经处理的异常(在 shiyan2.3.exe 中): 0xC0000005: 写入位置 0x0047A000 时发生访问冲突。
在*S.top++=number;这。。。。不懂啊,指针不对吗?
在线等,谢谢了
...全文
相关推荐
在线处理法求数列最大子列和
在线处理法求数列的最大子列和,将时间复杂度降为n,值得学习借鉴
在线象数抽签求测(仅供娱乐)
在线象数抽签求测方法:1.冥想抽签法:求测者将要测事情,按预测师所编程序,集中意念反复冥想所测事情的人事与结果,待万念归一后,分先后任意摘取三张签牌。 2.默念抽签法:求测者反复按预测师所编程序,默念
欧拉公式求圆周率的matlab代码-competitive-programming:我针对多个在线法官的问题提供的解决方案,包括UVa,Cod
欧拉公式求长期率的matlab代码竞争性编程我针对多个在线评委解决的许多编程(计算机科学)问题的解决方案,包括,,,,,和。代码优选地,我的解决方案是用C++编写的。每当我发现自己无法用纯C++解决某
DVD在线租赁问题三的数学模型与求
### DVD在线租赁问题三的数学模型与求解#### 概述随着互联网技术的发展以及人们生活方式的变化,在线租赁服务逐渐成为一种趋势。
在线求java游戏开发
【岗位职责】1、参与项目需求讨论和项目开发方案制定。2、负责系统的架构设计和开发工作,保证系统的架构质量。3、深入理解业务需求,持续推动产品性能和系统优化。4、从事面向海外市场的棋牌游戏开发。【任职要


