用堆栈来实现四则运算.(C语言)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用堆栈来实现四则运算.(C语言)相关的知识,希望对你有一定的参考价值。
数据结构的问题
here it is,1个半小时才搞定的,好辛苦,呵呵:#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>
double var[1024];
char opt[1024];
double* sp1 = var;
char* sp2 = opt;
#define PUSH(s, v) (*s++ = v)
#define POP(s) (*--s)
#define EMPTY1() (sp1 == var)
#define EMPTY2() (sp2 == opt)
#define TOP(s) (s[-1])
#define isopt1(c) (c == '+' || c == '-')
#define isopt2(c) (c == '*' || c == '/')
#define isopt(c) (isopt1(c) || isopt2(c))
#define isbkt(c) (c == '(')
double docal(double lhs, double rhs, char op)
switch(op)
case '+':return lhs + rhs;
case '-':return lhs - rhs;
case '*':return lhs * rhs;
if(op == '/' && rhs == 0)
printf("divided by zero encountered.\n");
exit(0);
return lhs / rhs;
void eval1(char* expr)
double t1, t2;
while(sp1 - var > 1 && !EMPTY2() && TOP(sp2) != '(')
t2 = POP(sp1);
t1 = POP(sp1);
PUSH(sp1, docal(t1, t2, POP(sp2)));
if(expr)
PUSH(sp2, *expr);
void eval2(char* expr)
double t1, t2;
while(TOP(sp2) != '(')
t2 = POP(sp1);
t1 = POP(sp1);
PUSH(sp1, docal(t1, t2, POP(sp2)));
POP(sp2);
double parse(char* expr)
double val;
while(*expr)
if(isdigit(*expr))
sscanf(expr, "%lf", &val);
PUSH(sp1, val);
while(isdigit(*expr) || *expr == '.')
++expr;
--expr;
else if(isopt(*expr))
if(EMPTY2() || (isopt1(TOP(sp2)) && !isopt1(*expr)) || isbkt(TOP(sp2)))
PUSH(sp2, *expr);
else if(isopt(TOP(sp2)))
eval1(expr);
else if(*expr == '(')
PUSH(sp2, *expr);
参考技术A float compvalue(char postexp[])
float d;
char ch;
int i=0;
st.top=-1;
ch=postexp[i];i++;
while(ch!='\0')
switch(ch)
case'+':
st.data[st.top-1]=st.data[st.top-1]+st.data[st.top];
st.top--;
break;
case'-':
st.data[st.top-1]=st.data[st.top-1]-st.data[st.top];
st.top--;
break;
case'*':
st.data[st.top-1]=st.data[st.top-1]*st.data[st.top];
st.top--;
break;
case'/':
if(st.data[st.top]!=0)
st.data[st.top-1]=st.data[st.top-1]/st.data[st.top];
else
printf("\n\t除零错误!\n");
exit(0);
st.top--;
break;
default:
d=0;
while(ch>='0'&&ch<='9')
d=10*d+ch-'0';
ch=postexp[i];
i++;
st.top++;
st.data[st.top]=d;
ch=postexp[i];
i++;
return st.data[st.top];
参考技术B 好像不是很容易!我再编下看看!
用堆栈实现算术运算
老感觉自己对算法技术不太过硬,今天开始多学学别人好的算法。
以下为一个博主的简单算法,摘录一下:
以下是算法运算的核心:
/*选择行列标*/
int ChooseIJ(char index)
{
int i;
switch(index)
{
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;
}
return i;
}
/*判断运算符优先级*/
char Judge(char top, char ch)
{
static char order[][7]={
// + - * / ( ) #
/* + */ ‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘,
/* - */ ‘>‘,‘>‘,‘<‘,‘<‘,‘<‘,‘>‘,‘>‘,
/* * */ ‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘,
/* / */ ‘>‘,‘>‘,‘>‘,‘>‘,‘<‘,‘>‘,‘>‘,
/* ( */ ‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘=‘,‘ ‘,
/* ) */ ‘>‘,‘>‘,‘>‘,‘>‘,‘ ‘,‘>‘,‘>‘,
/* # */ ‘<‘,‘<‘,‘<‘,‘<‘,‘<‘,‘ ‘,‘=‘
};
int i,j;
i = ChooseIJ(top);
j = ChooseIJ(ch);
return order[i][j];
}
switch(Judge(GetTop(&Ope), c))
{
case ‘<‘://栈顶运算符优先级低于当前操作符, 接收下一个字符
Push(&Ope, c);
c = getchar();
break;
case ‘=‘://当遇到右括号时 就出括号, 并接收下一个字符
Pop(&Ope);
c = getchar();
break;
case ‘>‘://栈顶的操作符优先级高 , 说明需要运算 , 并将计算结果压入操作数栈中
chOpe = Pop(&Ope);
a = Pop(&Num);
b = Pop(&Num);
Push(&Num, Operate(b,chOpe,a));
break;
}
请问有几个人能看懂其中的内容
以上是关于用堆栈来实现四则运算.(C语言)的主要内容,如果未能解决你的问题,请参考以下文章