malloc-数据结构用栈实现算术表达式的求值运算

问题描述

数据结构用栈实现算术表达式的求值运算

小白一枚,最近用栈实现算术表达式的求值运算结果出现好多问题,单独的加减乘除运算都能够实现,但一旦加上括号运算就停在那命令窗口也不能输入信息,跪求大神指点原因
附上代码和截图:
#include
#include
#include
#define STACK_INIT_SIZE 100 //存储空间初始分配量;
#define S 10 //存储空间分配增量;
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct{
char base;
char *top;
int stacksize;
}sqstack; //定义运算符类型栈;
typedef struct{
int *base;
int *top;
int stacksize;
}stack; //定义运算数栈;
void InitStack(sqstack &OPTR) //构建运算符栈;
{
OPTR.base=(char *)malloc(STACK_INIT_SIZE*sizeof(char));
if(!OPTR.base)
printf("Error!
");
OPTR.top=OPTR.base;
OPTR.stacksize=STACK_INIT_SIZE;
return;
}
void Initstack(stack &OPND) //构建运算数栈;
{
OPND.base=(int *)malloc(STACK_INIT_SIZE*sizeof(int));
if(!OPND.base)
printf("ERror!");
OPND.top=OPND.base;
OPND.stacksize=STACK_INIT_SIZE;
return;
}
int In(char ch) //判断字符是否是运算符;
{
int r;
switch(ch)
{
case '+':
case '-':
case '
':
case '/':
case '#':r=1;break;
default:r=0;break;
}
return r;
}
void PuSh(sqstack &OPTR,char ch) //运算符栈插入新的运算符栈顶元素;
{
if(OPTR.top-OPTR.base>=OPTR.stacksize) //栈满,追加存储空间;
{
OPTR.base=(char )realloc(OPTR.base,(OPTR.stacksize+S)*sizeof(char));
if(!OPTR.base)
printf("错误!");
OPTR.top=OPTR.base+OPTR.stacksize;
OPTR.stacksize+=S;
}
*OPTR.top++=ch;
printf("成功插入(puSh)运算符栈顶元素!
");
}
void PoP(sqstack &OPTR,char &ch) //删除字符的栈顶元素;(!!!!!!!!!!!!!!)
{
if(OPTR.top==OPTR.base)
printf("error");
ch=
--OPTR.top;
printf("删除字符栈顶元素!
");
}
char GetTop(sqstack &OPTR) //得到运算符栈顶元素;(!!!!!!!!!!!!!)
{
char c;
if(OPTR.top==OPTR.base)
printf("error!");
c=*(OPTR.top-1);

printf("运算符栈顶元素正常
");
return c;

}
void Push(stack &OPND,int e) //运算数栈插入新的运算数栈顶元素;
{
if(OPND.top-OPND.base>=OPND.stacksize) //栈满,追加空间;
{ OPND.base=(int )realloc(OPND.base,(OPND.stacksize+S)*sizeof(int));
if(!OPND.base)
printf("运算数栈错误!");
OPND.top=OPND.base+OPND.stacksize;
OPND.stacksize+=S;
}
*OPND.top++=e;
printf("成功插入运算数栈!
");
}
void Pop(stack &OPND,int &e) //删除运算数栈的栈顶元素;(!!!!!!!!!!!!!!!)
{
if(OPND.top==OPND.base)
printf("error");

e= --OPND.top;
printf("成功删除运算数栈!");
}
int Gettop(stack &OPND) //得到运算数栈顶元素;(!!!!!!!!!!!!!!!!!!)
{
int a;
if(OPND.top==OPND.base)
return 0;
else
a=*(OPND.top-1);
return a;
}
char compare(char a,char b) //判断运算符的优先级;
{
int i,j;
int array[7][7]= //1表示">",-1表示"<",0表示"=",2表示不可能
{
{1,1,-1,-1,-1,1,1},
{1,1,-1,-1,-1,1,1},
{1,1,1,1,-1,1,1},
{1,1,1,1,-1,1,1},
{-1,-1,-1,-1,-1,0,2},
{1,1,1,1,2,1,1},
{-1,-1,-1,-1,-1,2,0}
};
switch(a)
{
case '+':i=0;break;
case '-':i=1;break;
case '*':i=2;break;
case '/':i=3;break;
case '(':i=4;break;
case ')':i=5;break;
case '#':i=6;break;
}
switch(b)
{
case '+':j=0;break;
case '-':j=1;break;
case '*':j=2;break;
case '/':j=3;break;
case '(':j=4;break;
case ')':j=5;break;
case '#':j=6;break;
}
if(array[i][j]==1)
return '>';
else if(array[i][j]==-1)
return '<';
else if(array[i][j]==0)
return '=';
else printf("error!");
printf("该函数被调用");
return 1;

}
int operate(int p,char f,int q)
{
switch(f)
{
case '+':return p+q;
case '-':return p-q;
case '*':return p*q;
case '/':return p/q;
}
return 1;
}
int EvaluateExpression()
{
char c,f, d[100],e;
int i, num, tmpa, tmpb;
sqstack OPTR;
stack OPND;
InitStack(OPTR);Initstack(OPND);
PuSh(OPTR,'#');
c=getchar();
while(c!='#'||(e=GetTop(OPTR))!='#')
{
if(c>='0'&&c<='9')
{
i=0;
do{
d[i++]=c;
c=getchar();
}while(c>='0'&&c<='9');
d[i]='';
num=atoi(d);
Push(OPND, num);
}
else if(In(c))
{
switch(compare(GetTop(OPTR), c))
{
case '<': PuSh(OPTR, c);c=getchar();
break;
case '=': PoP(OPTR, f);c=getchar();
break;
case '>': PoP(OPTR, f);Pop(OPND, tmpb);Pop(OPND, tmpa);
Push(OPND, operate(tmpa, f, tmpb));
break;
}
}
}
return Gettop(OPND);
}
int EvaluateExpression(); //主操作函数
void main()
{
int r;
printf("请输入表达式:");
r=EvaluateExpression();
printf("输出结果为:%d
",r);
}

解决方案

数据结构之栈的应用----算术表达式的实现

解决方案二:

你有没有学数据结构啊 可以看看数据结构的书 可以把表达式转换成后置表达式然后计算 很方便的

解决方案三:

出入栈的限制条件把对括号的匹配也做成一个条件判断比较好。

时间: 2024-09-24 19:00:30

malloc-数据结构用栈实现算术表达式的求值运算的相关文章

abcde-怎样用c实现链栈的算术表达式运算,不得使用stl模板

问题描述 怎样用c实现链栈的算术表达式运算,不得使用stl模板 按照严蔚敏版的书上的算法,用c语言链栈实现,不让使用stl模板,有没有原代码 解决方案 #include""stdio.h"" #include""stdlib.h"" #include""string.h"" #include""math.h"" #define true 1 #de

qdskd-怎样用c实现链栈的算术表达式运算,不得使用stl模板

问题描述 怎样用c实现链栈的算术表达式运算,不得使用stl模板 按照严蔚敏版的书上的算法,用c语言链栈实现,不让使用stl模板,有没有原代码 解决方案 http://download.csdn.net/detail/immoyu/3431468 解决方案二: 利用栈实现简单算术表达式求值算术表达式求值(顺序栈实现)

中缀转后缀表达式并求值

通过栈将中缀表达式转换为后缀表达式并根据后缀表达式求解,包含的Header.h为之前发过的栈操作相关函数实例程序,改成头文件就行.练习+记录,高手无视. OutPut: The init formula:3+4*5+(6*7+8)*9 The stack is empty. Convert result:345*+67*8+9*+ Calculate result:473 //Code by Pnig0s1992 //Date:2012,3,21 #include <stdio.h> #inc

Maxima表达式、求值、化简

Maxima 是一个处理数学表达式的系统,例如x + y, sin(a + bπ)以及u · v − v · u Maxima 并不太关心表达式的含义,一个表达式是否有意义由使用者来判断. 有时你想给未知数赋值并且要计算表达式的值.Maxima 很善长做这件事.但是Maxima 也很善长推迟赋值;你可以先对表达式做一番处理,然后才给(也许永远不给)未知数赋值. 我们先看几个例子: 1.我想计算球的体积. (%i1) V: 4/3 *&http://www.aliyun.com/zixun/agg

利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现

#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Data Structures>> # Release 3.0 # chengang882 @ 2016-12-20 # 它可以将常见的中缀表达式转换成后缀表达式,并计算这个表达示的值 # Completed implementation of a stack ADT #数据结构 class Stac

急急急!设计一个程序实现基于二叉树的算术表达式的操作 求代码 有重谢!

问题描述 急急急!设计一个程序实现基于二叉树的算术表达式的操作 求代码 有重谢! [问题描述] 一个表达式和一棵二叉树之间,存在着自然的对应关系.写一个程序,实现基于二叉树表示的算术表达式的操作. 知识点:二叉树,表达式树,二叉树遍历 难度级:★★★ [任务要求] 假设算术表达式 Expression 内可以含有变量(a-z).常量(0-9)和二元运算符(+,-,*,/,^(乘幂)). 实现以下操作: 1) ReadExpre(E)-以字符序列的形式输入语法正确的前缀表达式并构造表达式 E. 2

数据结构课程设计-用栈实现表达式求值的方法详解_C 语言

1.需求分析设计一个程序,演示用算符优先法对算术表达式求值的过程.利用算符优先关系,实现对算术四则混合运算表达式的求值.(1)输入的形式:表达式,例如2*(3+4)     包含的运算符只能有'+' .'-' .'*' .'/' .'('. ')':(2)输出的形式:运算结果,例如2*(3+4)=14:(3)程序所能达到的功能:对表达式求值并输出 2.系统设计1.栈的抽象数据类型定义:ADT Stack{数据对象:D={ai|ai∈ElemSet,i=1,2,-,n,n≥0}数据关系:R1={<

java实现任意四则运算表达式求值算法_C 语言

本文实例讲述了java实现任意四则运算表达式求值算法.分享给大家供大家参考.具体分析如下: 该程序用于计算任意四则运算表达式.如 4 * ( 10 + 2 ) + 1 的结果应该为 49. 算法说明: 1. 首先定义运算符优先级.我们用一个 Map<String, Map<String, String>> 来保存优先级表.这样我们就可以通过下面的方式来计算两个运算符的优先级了: /** * 查表得到op1和op2的优先级 * @param op1 运算符1 * @param op2

MYSQL表达式求值和MYSQL类型转换

    2.4 表达式求值和类型转换    MySQL允许编写包括常量.函数调用和表列引用的表达式.这些值可利用不同类型的运算符进行组合,诸如算术运算符或比较运算符.表达式的项可用圆括号来分组.表达式在SELECT 语句的列选择列表和WHERE 子句中出现得最为频繁,如下所示:    所选择的每列给出了一个表达式,如WHERE 子句中所示的那样.表达式也出现在DELETE 和UPDATE语句的WHERE 子句中,以及出现在INSERT 语句的VALUES( ) 子句中.    在MySQL遇到一