c语言数据结构栈中得到最小值,数据结构中用栈实现表达式求值(c语言实现)...

本文介绍了一个使用栈来解析并计算个位数数学表达式的程序。该程序能够处理包含加减乘除及括号的基本算术运算,并通过指针操作实现。经过测试,对于个位数表达式,该程序能准确给出计算结果。

/*

该程序完成了个位数的各类表达式求值

运用了数据结构中的栈及对栈操作的各类函数,操作全用指针完成

如输入 2+3*(3+3*1)#  输出结果为 20

经测试个位数的表达式运算结果均正确

*/

#include

#include

#include

#define STACK_INIT_SIZE 1000

typedef struct             //建造一个空栈

{

char *base;

char *top;

int stacksize;

}SqStack;

int InitStack(SqStack *s)       //给栈分配空间,初始化栈

{

(*s).base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));

if(!((*s).base))

exit(0);

s->top=s->base;

s->stacksize=STACK_INIT_SIZE;

return 1;

}

int Push(SqStack *s,char *ch)    //把接收到的第一个元素压入栈

{

if(s->top-s->base>=STACK_INIT_SIZE)

return 0;

*((*s).top)=*ch;

(*s).top++;

return 1;

}

void  Pop(SqStack *s,char *ch){      //删除栈顶元素

s->top--;

*ch=*(s->top);

}

char* Gettop(SqStack *s)            //得到栈顶元素

{

if(s->top!=s->base)

return (*s).top-1;

}

int In(char *c)          //判断吸收的数据是不是字符

{

switch(*c)

{

case'+':

case'-':

case'*':

case'/':

case'(':

case')':

case'#':return 1;

default:return 0;

}

}

char *Operate(char *a,char *theta,char *b)   //弹出栈的元素进行运算

{

char *c;

*a=*a-48;

*b=*b-48;

c=(char *)malloc(sizeof(char));

switch(*theta)

{

case'+':

*c=*a+*b+48;

break;

case'-':

*c=*a-*b+48;

break;

case'*':

*c=(*a)*(*b)+48;

break;

case'/':*c=(*a)/(*b)+48;break;

}

return c;

}

char Precede(char *ch1,char *ch2)     //判断运算符的先后顺序

{

if(*ch1=='+')

{

if(*ch2=='+')return '>';

if(*ch2=='-')return '>';

if(*ch2=='*')return '

if(*ch2=='/')return '

if(*ch2=='(')return '

if(*ch2==')')return '>';

if(*ch2=='#')return '>';

}

if(*ch1=='-')

{

if(*ch2=='+')return '>';

if(*ch2=='-')return '>';

if(*ch2=='*')return '

if(*ch2=='/')return '

if(*ch2=='(')return '

if(*ch2==')')return '>';

if(*ch2=='#')return '>';

}

if(*ch1=='*')

{

if(*ch2=='+')return '>';

if(*ch2=='-')return '>';

if(*ch2=='*')return '>';

if(*ch2=='/')return '>';

if(*ch2=='(')return '

if(*ch2==')')return '>';

if(*ch2=='#')return '>';

}

if(*ch1=='/')

{

if(*ch2=='+')return '>';

if(*ch2=='-')return '>';

if(*ch2=='*')return '>';

if(*ch2=='/')return '>';

if(*ch2=='(')return '

if(*ch2==')')return '>';

if(*ch2=='#')return '>';

}

if(*ch1=='(')

{

if(*ch2=='+')return '

if(*ch2=='-')return '

if(*ch2=='*')return '

if(*ch2=='/')return '

if(*ch2=='(')return '

if(*ch2==')')return '=';

}

if(*ch1==')')

{

if(*ch2=='+')return '>';

if(*ch2=='-')return '>';

if(*ch2=='*')return '>';

if(*ch2=='/')return '>';

if(*ch2==')')return '>';

if(*ch2=='#')return '>';

}

if(*ch1=='#')

{

if(*ch2=='+')return '

if(*ch2=='-')return '

if(*ch2=='*')return '

if(*ch2=='/')return '

if(*ch2=='(')return '

if(*ch2=='#')return '=';

}

}

int main()

{

char *theta,*ch,*x,*c;

char *a,*b;

SqStack OPND;

SqStack OPTR;

InitStack(&OPND);    //创作一个存数字的栈

InitStack(&OPTR);     //创作一个存运算符和括号的栈

c=(char *)malloc(sizeof(char));   //分配内存

ch=(char *)malloc(sizeof(char));

x=(char *)malloc(sizeof(char));

theta=(char *)malloc(sizeof(char));

a=(char *)malloc(sizeof(char));

b=(char *)malloc(sizeof(char));

*c='#';

Push(&OPTR,c);

printf("请输入以#结尾的表达式\n");

*ch=getchar();

while((*ch)!='#'||(*(Gettop(&OPTR)))!='#'){  //运算结束停止条件

if(!In(ch)){

Push(&OPND,ch);

printf("压入OPND栈  %d\n",*ch);

*ch=getchar();

}

else

switch(Precede(Gettop(&OPTR),ch))     //通过比较接收的字符来进行运算

{

case'

Push(&OPTR,ch);

printf("压入OPTR栈   %c\n",*ch);

*ch=getchar();

break;

case'>':

Pop(&OPTR,theta);

printf("压入前%d %d\n",*b,*a);

Pop(&OPND,b);

Pop(&OPND,a);

printf("删除后OPND的头%d %d\n",*b,*a);

Push(&OPND,Operate(a,theta,b));

printf("运算后 %d\n",*theta);

break;

case'=':

Pop(&OPTR,x);

*ch=getchar();

break;}

}

printf("\n\n\n");

printf("运算结果= %d",(*Gettop(&OPND)-48));

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值