数据结构-表达式求值,为什么只能求类似于3*(5-2)的一位数表达式?求大神指点

问题描述

数据结构-表达式求值,为什么只能求类似于3*(5-2)的一位数表达式?求大神指点

#include
#include
#define STACK_INIT_SIZE 100
#define STACKINCREMENT 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
using namespace std;
typedef struct
{
int base;
int *top;
int stacksize;
}SqStack;
int InitStack(SqStack &S)
{
S.base=(int *)malloc(STACK_INIT_SIZE * sizeof(int));
if(!S.base) exit(OVERFLOW);
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int ClearStack(SqStack &S)
{
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
return OK;
}
int GetTop(SqStack S,int &e)
{
if(S.base==S.top)
return ERROR;
e=
(S.top-1);
return OK;
}
int Push(SqStack &S,int e)
{
if((S.top-S.base)>=S.stacksize)
{
S.base=(int )realloc(S.base,(S.stacksize+STACKINCREMENT)*sizeof(int));
if(!S.base)
exit(OVERFLOW);
S.top=S.base+S.stacksize;
S.stacksize+=STACKINCREMENT;
}
*S.top=e;
S.top++;
return OK;
}
int Pop(SqStack &S,int &e)
{
if(S.top==S.base) return ERROR;
S.top--;
e=*S.top;
return OK;
}
int Pop2(SqStack &S,char &e)
{
if(S.top==S.base) return ERROR;
S.top--;
e=*S.top;
return OK;
}
bool StackEmpty(SqStack S)
{
if(S.top==S.base)
return true;
else
return false;
}
int StackLength(SqStack S)
{
int len=0;
if(S.top==S.base)
return 0;
else
while(S.top!=S.base)
{
S.top--;
len++;
}
return len;
}
//数制转换:输入任意一个非负十进制整数,打印输出与其等值的进制数
void conversion(SqStack S)
{
int N,id,n;
cout<<"请输入任意一个非负十进制整数:";
cin>>N;
cout<<"请输入需要转换的进制 :";
cin>>id;
n=N;
while(N)
{
Push(S,N%id);
N=N/id;
}
cout<<"此时栈的长度为"<
cout
while(S.top!=S.base)
{
S.top--;
cout
}
cout
cout
}
//括号匹配的检验
int match(SqStack S)
{
char a[100],b[100];
cout
cin>>a;
for(int i=0;i
{
cout
if((a[i]!='[') && (a[i]!=']') && (a[i]!='(') && (a[i]!=')'))
{
cout
return 0;
}
else
{
if((a[i]=='[')||(a[i]=='('))
{
Push(S,a[i]);
cout
}
else if(a[i]==']')
{
if(S.top==S.base)
{
cout
return 0;
}
else
{
S.top--;
if(*S.top=='[')
{
b[i]=*S.top;
cout
cout
}
else
{
cout
return 0;
}
}
}
else
{
if(a[i]==')')
{
if(S.top==S.base)
{
cout
return 0;
}
else
{
S.top--;
if(*S.top=='(')
{
b[i]=*S.top;
cout
cout
}
else
{
cout
return 0;
}
}
}
}
}
}
cout
return 1;
}
//行编辑程序
void LineEdit(SqStack S)
{
char a[100],b[100];
int *base=S.base;
cout
cin>>a;
for(int i=0;i
{
while(a[i]!=EOF && a[i]!='
')
{
if(a[i]=='#') //'#'表示前一个字符无效
{
Pop2(S,b[i-1]);
cout
break;
}
else if(a[i]=='@') //'@'表示当前行中的字符均无效
{
ClearStack(S);
break;
}
else
{
Push(S,a[i]);
break;
}
}
}
while(base!=S.top)
{
cout
base++;
}
cout
}
int Precede(char a,char b) //1代表'>';0代表'=';-1代表'<'
{
int st;
if(a=='+')
{
switch(b)
{
case '+': st=1;
break;
case '-': st=1;
break;
case '
': st=-1;
break;
case '/': st=-1;
break;
case '(': st=-1;
break;
case ')': st=1;
break;
case '#': st=1;
break;
}
}
else if(a=='-')
{
switch(b)
{
case '+': st=1;
break;
case '-': st=1;
break;
case '*': st=-1;
break;
case '/': st=-1;
break;
case '(': st=-1;
break;
case ')': st=1;
break;
case '#': st=1;
break;
}
}
else if(a=='*')
{
switch(b)
{
case '+': st=1;
break;
case '-': st=1;
break;
case '*': st=1;
break;
case '/': st=1;
break;
case '(': st=-1;
break;
case ')': st=1;
break;
case '#': st=1;
break;
}
}
else if(a=='/')
{
switch(b)
{
case '+': st=1;
break;
case '-': st=1;
break;
case '*': st=1;
break;
case '/': st=1;
break;
case '(': st=-1;
break;
case ')': st=1;
break;
case '#': st=1;
break;
}
}
else if(a=='(')
{
switch(b)
{
case '+': st=-1;
break;
case '-': st=-1;
break;
case '*': st=-1;
break;
case '/': st=-1;
break;
case '(': st=-1;
break;
case ')': st=0;
break;
case '#': break;
}
}
else if(a==')')
{
switch(b)
{
case '+': st=1;
break;
case '-': st=1;
break;
case '*': st=1;
break;
case '/': st=1;
break;
case '(': break;
case ')': st=1;
break;
case '#': st=1;
break;
}
}
else if(a=='#')
{
switch(b)
{
case '+': st=-1;
break;
case '-': st=-1;
break;
case '*': st=-1;
break;
case '/': st=-1;
break;
case '(': st=-1;
break;
case ')': break;
case '#': st=0;
break;
}
}
return st;
}
int Operate(int a,char theta,int b)
{
int result;
switch(theta)
{
case'+': result=a+b;
break;
case'-': result=a-b;
break;
case'*': result=a*b;
break;
case'/': result=a/b;
break;
}
return result;
}
int EvaluteExpression()
{
SqStack OPTR,OPND;
char x,theta;
char arr[100],dr[]={'#'};
int j=0,e,n,a,b,result;
int y;
int optrT,*optrB,*opndT,*opndB;
InitStack(OPTR);
Push(OPTR,'#'); //以int值进栈,出栈需转换
InitStack(OPND);
//cout<<"请输入算术表达式:"; //算术表达式以'#'结束
//cin>>arr;
cout<<"请输入:";
cin>>y
for(int i=0;i<strlen(arr);i++)
{
GetTop(OPTR,e);
cout<<"
***************************"<<endl;
cout<<"i="<<i<<endl;
cout<<"输入字符"<<arr[i]<<endl;
cout<<"char(e)="<<char(e)<<endl;
if(arr[i]!='#' || char(e)!='#')
{
if(arr[i]!='+' && arr[i]!='-' && arr[i]!='*' && arr[i]!='/' && arr[i]!='(' && arr[i]!=')' && arr[i]!='#') //操作数
{
Push(OPND,arr[i]-'0');
opndT=OPND.top;
opndB=OPND.base;
cout<<"操作数栈中元素:";
while(opndT!=opndB)
{
opndT--;
cout<<*opndT<<" ";
}
cout<<endl;
}
else
{
GetTop(OPTR,e);
cout<<"e="<<char(e)<<endl;
n=Precede(char(e),arr[i]);
cout<<"n="<<n<<endl;
switch(n)
{
case -1: Push(OPTR,arr[i]);
optrT=OPTR.top;
optrB=OPTR.base;
cout<<"运算符栈中元素:";
while(optrT!=optrB)
{
optrT--;
cout<<char(*optrT)<<" ";
}
cout<<endl;
break;
case 0: Pop2(OPTR,x);
opndT=OPND.top;
opndB=OPND.base;
cout<<"操作数栈中元素:";
while(opndT!=opndB)
{
opndT--;
cout<<*opndT<<" ";
}
cout<<endl;
optrT=OPTR.top;
optrB=OPTR.base;
cout<<"运算符栈中元素:";
while(optrT!=optrB)
{
optrT--;
cout<<char(*optrT)<<" ";
}
cout<<endl;
break;
case 1: Pop2(OPTR,theta);
Pop(OPND,b);
Pop(OPND,a);
Push(OPND,Operate(a,theta,b));
i--;
opndT=OPND.top;
opndB=OPND.base;
cout<<"操作数栈中元素:";
while(opndT!=opndB)
{
opndT--;
cout<<*opndT<<" ";
}
cout<<endl;
optrT=OPTR.top;
optrB=OPTR.base;
cout<<"运算符栈中元素:";
while(optrT!=optrB)
{
optrT--;
cout<<char(*optrT)<<" ";
}
cout<<endl;
break;
}
}
}
}
GetTop(OPND,result);
cout<<arr<<"="<<result<<endl;
return OK;
}
int main()
{
/*SqStack S;
InitStack(S);
conversion(S);
match(S);
LineEdit(S);*/
EvaluteExpression();
return OK;
}

解决方案

你代码错误太多,参考这个
http://blog.163.com/the_show_27@yeah/blog/static/107887293201032274128788/

人家就几十行代码,却能做比你多几倍的事情。

解决方案二:

表达式求值:2*(3*(5+2))

时间: 2024-08-03 07:08:57

数据结构-表达式求值,为什么只能求类似于3*(5-2)的一位数表达式?求大神指点的相关文章

二维数组-新手, C语言寻找三维数组正切面最大和的值,测试对但WA, 有题目和代码, 望大神指点

问题描述 新手, C语言寻找三维数组正切面最大和的值,测试对但WA, 有题目和代码, 望大神指点 Description 给出一个长方体,求该长方体每个正切面上的元素之和的最大值. 正切面的意思就是与长方体某一面平行的切面.如果把长方体看作是一个三维数组,那么每个切面就是一个二维数组. Input 第一行是3个正整数a.b.c,分别表示长方体的长.宽.高.0 < a, b, c ≤ 60 接下来是 c 块数据,每一块数据有a行.每行b个整数. Output 输出切面元素和的最大值. Sample

求大神指点 java无参带返回值方法问题

问题描述 求大神指点 java无参带返回值方法问题 max=(age>max)?age:max; 这这话是什么意思? 解决方案 max=(age>max)?age:max; 这是三步运算给max赋值,就相当于: f(age>max){ max=age; }else{ max=max; } 解决方案二: 如果age>max为真,则max=age,否则max=max 解决方案三: 如果age>max,就把age放入max 这个程序配合循环可以找到年纪最大的人 解决方案四: jav

pascal 编程-pascal 问题 计算式子的值 求大神指点

问题描述 pascal 问题 计算式子的值 求大神指点 描述 Description 给定一个表达式串,计算其最后结果 输入格式 Input Format 一个表达式串(只包函+-*/()等运算符,且是整除;表达式长度小于255个字符) 输出格式 Output Format 最后结果(一个整数) 样例输入 1+2*3+(1+2) 样例输出 10 program p1654; var tot:ansistring; function f(st:ansistring):longint; var i,

visual studio-vs中出现类型初始值设定项引发异常。求各位大神指点!!

问题描述 vs中出现类型初始值设定项引发异常.求各位大神指点!! "DotSpatial.Data.Rasters.GdalExtension.GdalHelper"的类型初始值设定项引发异常. 解决方案 只能看到是这个类的构造函数丢出了异常,如果这个类是你写的,需要进一步调试.否则看下文档,是不是调用不正确.

java-简单计算器Java代码非法表达式问题问题,求大神指点

问题描述 简单计算器Java代码非法表达式问题问题,求大神指点 import java.awt.*; import java.awt.event.*; import javax.swing.*; public class Jisuanqi extends JFrame implements ActionListener{ //计算器控件键 JFrame Jisuan = new JFrame("计算器"); private final String KEYS[] = {"7&

java-Java中同步线程不是应该先中断先继续吗,为什么我的没有?求大神指点

问题描述 Java中同步线程不是应该先中断先继续吗,为什么我的没有?求大神指点 代码如下: public class BuyTicketMain { public static void main(String args[ ]) { TicketHouse officer = new TicketHouse(); Thread zhangfei,likui,wangwu; zhangfei = new Thread(officer); zhangfei.setName("张飞"); l

c语言-关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点

问题描述 关于C语言链表的一些问题,代码怎么都运行不成功跪求大神指点 下面代码主要实现链表的创建,插入,删除,并且能将两个年龄递增链表进行合并成递减链表 然而在插入和删除操作中gets函数无法起作用,strcmp函数也出现位置冲突报错..功力不足实在解决不了..跪求大神解答..(感觉自己写的东西除了上面两个错误应该还有,但是因为位置冲突问题就只能编译到那个地方无法进行下去..我肉眼实在找不出来.. #include<stdio.h> #include<stdlib.h> #incl

查询-html下拉列表联动,求大神指点

问题描述 html下拉列表联动,求大神指点 我是用jquery datatable实现的table,现在有状态和在线两个下拉列表,现在只能实现状态和在线分别查询,如何将两个下拉列表关联起来呢?最好前台实现 解决方案 这个是用ajax实现的,给它一个onchange事件,然后在里面用ajax实现的,因为你前面一个变化就会有一个值传递到后台查询数据库然后从数据库里读取第二个下拉的值,然后返回页面赋给第二个下拉的: 解决方案二: 加载一个onchange事件

jquery-jQuery问题求大神指点

问题描述 jQuery问题求大神指点 <c:if test="${list_pro!=null}"> <c:forEach items="${list_pro}" var="d_p"> <div class="list_r_line"></div> <div class="clear"></div> <div class=&quo