C语言 任意表达式求值。(栈的应用
type sign(char ch1,char ch2)
{
int i,j;
char a[7][7]={
{'>','>','','>'},
{'>','>','','>'},
{'>','>','>','>','','>'},
{'>','>','>','>','','>'},
{'<','<','<','<','<','=',' '},
{'>','>','>','>',' ','>','>'},
{'<','<','<','<','<',' ','='}
};
i=firstvalue(ch1);
j=firstvalue(ch2);//调用函数两次,返回两个函数值
return a[i][j];
}
这个函数的返回问题吧, a[i][j]应该是这里的问题。
栈和队列的应用,我有写过魔王语言的,应该也是差不多的哈,在我空间:http://hi.baidu.com/zhangna%5F307/blog/item/aa92841a5d0245ddac6e75e8.html
自己看下哈~~基本操作差不多的~~
问题是你要什么样的表达式啊,,表达式很多啊。。。
以及,,递归也是栈的一种实现形式吧。。
逆波兰表达式
提交网页链接
逆波兰表达式是一种把运算符前置的算术表达式(又叫前缀表达式),例如普通的表达式2 + 3的逆波兰表示法为+ 2 3。逆波兰表达式的优点是运算符之间不必有优先级关系,也不必用括号改变运算次序,例如(2 + 3) * 4的逆波兰表示法为* + 2 3 4。本题求解逆波兰表达式的值,其中运算符包括+ - * /四个。
#include#include#include#includechar a[3010];double trans(){ //float is bugs scanf("%s",a); if(strlen(a)==1){ if(a[0]=='+')return trans()+trans(); if(a[0]=='-')return trans()-trans(); if(a[0]=='*')return trans()*trans(); if(a[0]=='/')return trans()/trans(); }else{ return atof(a); }}int main(){ printf("%f
", trans()); return 0;}
/***其中部分可作修改,表达式也可是输入的***/
#include "iostream.h"
const int n0=30;
int s1[n0+1]; //操作数栈
char s2[n0+1]; //运算符栈
int t1,t2;
int num[4]; //提取表达式中的整数
void calcu() //一次计算
{
int x1,x2,x;
char p;
//弹出一个运算符
p=s2[t2--];
//弹出两个操作数
x2=s1[t1--];
x1=s1[t1--];
//进行一次运算
switch(p) {
case '+':x=x1+x2;break;
case '-':x=x1-x2;break;
case '*':x=x1*x2;break;
case '/':x=x1/x2;
}
//结果压入操作数栈
s1[++t1]=x;
}
int calculator(char *f)
{
int v,i=0;
char *p=f;
t1=t2=0; //设置空栈
while (*p!='\0')
switch(*p) {
case '+': case '-':
while (t2&&(s2[t2]!='('))
//执行先遇到的加、减、乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case '*': case '/':
if (t2&&(s2[t2]=='*')||(s2[t2]=='/'))
//执行先遇到的乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case '(':
//左括号进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case ')':
while (s2[t2]!='(')
//执行括号内的加、减、乘、除运算
calcu();
//弹出左括号
t2--;
//读下一个字符
p++;
break;
default:
//把字符串转换成整数值
v=0;
do {
v=10*v+*p-'0';
p++;
} while((*p>='0')&&(*p<='9'));
//操作数进栈
s1[++t1]=v;
num[i++]=v;
};
//执行先遇到的加、减、乘、除运算
while (t2) calcu();
//返回结果
return s1[t1];
}
void main()
{
char a[]="5*(40+6)-39";
cout<<calculator(a)<<endl;
cout<<"其中的数字为:\n";
for (int i=0;i<4;i++)
{
cout<<num[i]<<' ';
}
cout<<endl;
}
原来做过的东西,是C++的,VC++6.0环境下调试运行成功。
/***
只适合整数的表达式求值
***/
/***其中部分可作修改,表达式也可是输入的***/
#include
"iostream.h"
const
int
n0=30;
int
s1[n0+1];
//操作数栈
char
s2[n0+1];
//运算符栈
int
t1,t2;
int
num[4];
//提取表达式中的整数
void
calcu()
//一次计算
{
int
x1,x2,x;
char
p;
//弹出一个运算符
p=s2[t2--];
//弹出两个操作数
x2=s1[t1--];
x1=s1[t1--];
//进行一次运算
switch(p)
{
case
'+':x=x1+x2;break;
case
'-':x=x1-x2;break;
case
'*':x=x1*x2;break;
case
'/':x=x1/x2;
}
//结果压入操作数栈
s1[++t1]=x;
}
int
calculator(char
*f)
{
int
v,i=0;
char
*p=f;
t1=t2=0;
//设置空栈
while
(*p!='\0')
switch(*p)
{
case
'+':
case
'-':
while
(t2&&(s2[t2]!='('))
//执行先遇到的加、减、乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case
'*':
case
'/':
if
(t2&&(s2[t2]=='*')||(s2[t2]=='/'))
//执行先遇到的乘、除运算
calcu();
//当前运算符进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case
'(':
//左括号进栈
s2[++t2]=*p;
//读下一个字符
p++;
break;
case
')':
while
(s2[t2]!='(')
//执行括号内的加、减、乘、除运算
calcu();
//弹出左括号
t2--;
//读下一个字符
p++;
break;
default:
//把字符串转换成整数值
v=0;
do
{
v=10*v+*p-'0';
p++;
}
while((*p>='0')&&(*p<='9'));
//操作数进栈
s1[++t1]=v;
num[i++]=v;
};
//执行先遇到的加、减、乘、除运算
while
(t2)
calcu();
//返回结果
return
s1[t1];
}
void
main()
{
char
a[]="5*(40+6)-39";
cout<<calculator(a)<<endl;
cout<<"其中的数字为:\n";
for
(int
i=0;i<4;i++)
{
cout<<num[i]<<'
';
}
cout<<endl;
}
原来做过的东西,是C++的,VC++6.0环境下调试运行成功。
戚梁贝加: /*** 只适合整数的表达式求值 ***/ /***其中部分可作修改,表达式也可是输入的***/ #include "iostream.h" const int n0=30; int s1[n0+1]; //操作数栈 char s2[n0+1]; //运算符栈 int t1,t2; int num[4]; //提取表达式中的整数 void calcu() //一次计算 ...
新田县15368178214: C语言用栈编写求表达式的值 - ?
戚梁贝加: //表达式输入完了之后直接回车,就出结果了,跟平时输入字符串一样./**********************************************算术表达式求值的算符优先级算法利用栈来实现括号匹配和表达式求值算法的详细说明,请查看清华大学出版社《数...
新田县15368178214: 栈的应用(C++)写“表达式求值”程序 - ?
戚梁贝加: 打开文件fopen得到文件内容是 fgets写入估计是 fwrite就这三个函数了,该不难的.你自己也说了,就输入,输出那两段不会,你每从文件中得到一行后,然后在把一行拆分成token,这个token要么是操作数,要么是操作符,然后...
新田县15368178214: C语言用栈实现表达式求值 - ?
戚梁贝加: type sign(char ch1,char ch2) {int i,j;char a[7][7]={ {'>','>','<','<','<','>','>'}, {'>','>','<','<','<','>','>'}, {'>','>','>','>','<','>','>'}, {'>','>','>','>','<','>','>'}, {'<','<','<','<','<','=',' '}, {'>','>','>','>',' ','>','>'}, {'<','<','<','<','<',' ','='} };i=firstvalue(ch1); j=firstvalue(ch2);//调...
新田县15368178214: C++栈的应用:表达式求值 - ?
戚梁贝加: 先转后缀,再用栈求值 以前我用PASCAL做过的,可惜程序丢了,不能给你了
新田县15368178214: 利用C语言 数据结构 栈 两种方法实现表达式的自动计算 - ?
戚梁贝加: #include<stdio.h>#include<stdlib.h>#define MaxSize 99 void translate(char str[],char exp[]) /*将算术表达式转换成后缀表达式*/ { struct { char data[MaxSize]; int top; /*top为栈顶*/ }op; /*定义一个含data和top的结构体*/ char ch;int i = 0,t = 0; op.top =...
新田县15368178214: 实现算术表达式求值程序(栈的运用) - ?
戚梁贝加: #include #include #include typedef struct node{ char data; struct node *next;}snode,*slink;int...
新田县15368178214: c语言版数据结构课程设计利用栈求表达式的值,加减乘除,带括弧的混合运算. - ?
戚梁贝加: 跟你的要求符合#include "stdio.h"#include "string.h"#include "stdlib.h"#define MAXLEN 100 typedef struct { char op; int level; }opt; typedef struct //定义操作符栈 { opt st[MAXLEN]; int top; }op_stack; typedef struct //定义值栈 { double D[...
新田县15368178214: 用C/C++ 编写“利用栈实现表达式求值” - ?
戚梁贝加: #include<iostream> #include<cmath> using namespace std; const double PI=3.141592654; const int SZ=1000; int MKAC=0; double STP=1; template <class Type> class STACK{ private: Type base[SZ]; int Size; public: STACK(){Size=0;}; void push(...
新田县15368178214: 谁能帮我用C语言写一个表达式求值的程序?要用到栈. - ?
戚梁贝加: 有意义吗? 如:int a=1,b=2,c;c=a+b;//这里的a,b,c都在栈内存...