c语言一个字符串怎么做除法,C语言字符串四则运算的实现!求指导

满意答案

00e27ab806e4881f8254fe7ae8741834.png

wdgume

2014.05.04

00e27ab806e4881f8254fe7ae8741834.png

采纳率:55%    等级:12

已帮助:10460人

以前写过一个,支持四则运算以及括号运算,采用栈实现

#include<stdio.h>

#include<malloc.h>

#define null 0

#define max 100

typedef struct date /*定义字符栈*/

{

char sk[max];

int top;

}seqstack;

typedef struct da /*定义数据栈*/

{

int sk[max];

int top;

}stack;

void push(seqstack *s,char x) /*进栈*/

{

if(s->top==max-1)

{

printf("out of space.\n");

}

s->top++;

s->sk[s->top]=x;

}

void spush(stack *s,int x) /*进栈*/

{

if(s->top==max-1)

{

printf("sout of space.\n");

}

s->top++;

s->sk[s->top]=x;

}

char pop(seqstack *s ,char c) /*出栈*/

{

if(s->top==-1)

{

printf("no element.\n");return 0;

}

else

{

c=s->sk[s->top];

s->top--;

return c;

}

}

int spop(stack *s ,int c) /*出栈*/

{

if(s->top==-1)

{

printf("sno element.\n");return 0;

}

else

{

c=s->sk[s->top];

s->top--;

return c;

}

}

int pp(char c) /*判断字符*/

{

switch(c)

{

case '#':return 0;break;

case '+':return 2;break;

case '-':return 2;break;

case '*':return 3;break;

case '/':return 3;break;

case '(':return 1;break;

case ')':return 4;break;

default:return 9;break;

}

}

int yunsuan(int a,char b,int c) /*运算*/

{

switch(b)

{

case '+':return a+c;break;

case '-':return a-c;break;

case '*':return a*c;break;

default:

if(c==0) return 0; //除数为0

return a/c;break;

}

}

char bijiao(seqstack *f,char c) /*比较优先级*/

{

int m,n;

char w;

m=pp(c);

w=f->sk[f->top];

n=pp(w);

if(n<m) return '>';

return '<';

}

void main()

{

int x,s;

int q=0,w=0;

int p=0; /*标示变量*/

char ch,th='\0',d='\0';

seqstack *h;

h=(seqstack*)malloc(sizeof(seqstack));

if(!h) printf("no creat");

h->top=-1;

stack *g;

g=(stack*)malloc(sizeof(stack));

if(!g) printf("no door");

g->top=-1;

push(h,'#');

ch=getchar();

while(ch!='\n')

{

if(pp(ch)==9)

{

if(p>0)

{

x=spop(g,x);

spush(g,10*x+ch-48);

}

else

{

spush(g,ch-48);

p++;

}

}

if(pp(ch)==1)

{ push(h,ch);p=0;}

if(pp(ch)==4)

{

while(pp(h->sk[h->top])!=1)

{

q=spop(g,q);

w=spop(g,w);

th=pop(h,th);

spush(g,yunsuan(w,th,q));

}

d=pop(h,d);p=0;

}

if(pp(ch)!=9&&pp(ch)!=1&&pp(ch)!=4)

{

switch(bijiao(h,ch))

{

case '>':push(h,ch);p=0;break;

case '<':

while(pp(h->sk[h->top])>=pp(ch))

{

q=spop(g,q);w=spop(g,w);

th=pop(h,th);

spush(g,yunsuan(w,th,q));

}

push(h,ch); p=0;break;

}

}

ch=getchar();

}

while(ch=='\n'&&h->sk[h->top]!='#')

{

q=spop(g,q);w=spop(g,w);

th=pop(h,th);

s=yunsuan(w,th,q);

spush(g,s);

}

printf("the answer is %d\n",g->sk[g->top]);

}

00分享举报

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值