当前位置: 代码迷 >> C语言 >> 不久前刚做的课程设计,发上来高手指教
  详细解决方案

不久前刚做的课程设计,发上来高手指教

热度:320   发布时间:2004-09-24 15:29:00.0
不久前刚做的课程设计,发上来高手指教

利用栈的性质,编写一个能四则运算程序,支持括号+ - * /,输入完后以#号结束,只支持个位数的计算

例如 1+2+3*(4+5)#

#include <stdio.h> #define MAXNUM 100 #define FALSE 0 #define TRUE 1 struct sqstack{ int stack[MAXNUM]; int top; }optr,opnd;

int initstack (struct sqstack *s) { s->top=-1 ; return TRUE; }

int push (struct sqstack *s,int x) { if (s->top>MAXNUM-1) return FALSE; s->top++; s->stack[s->top]=x; return TRUE; }

int pop (struct sqstack *s) { int x; if (s->top<0) return NULL; x=s->stack[s->top]; s->top--; return x; }

int gettop (struct sqstack *s) { if (s->top<0) return NULL; return (s->stack[s->top]); }

int operate (int n1,int s,int n2) { switch (s) { case '+' :return (n1-48)+(n2-48)+48; case '-' :return (n1-48)-(n2-48)+48; case '*' :return (n1-48)*(n2-48)+48; case '/' :return (n1-48)/(n2-48)+48; } }

int precede (int a,int b) { switch (a) { case '+': case '-': switch (b) { case '+': case '-': case ')': case '#': return '>'; case '*': case '/': case '(': return '<'; };break; case '*': case '/': switch (b) { case '+': case '-': case '*': case '/': case ')': case '#': return '>'; case '(': return '<'; };break; case '(': switch (b) { case '+': case '-': case '*': case '/': case '(': return '<'; case ')': return '='; case '#': return FALSE; };break; case ')': switch (b) { case '+': case '-': case '*': case '/': case ')': case '#': return '>'; case '(': return FALSE; };break; case '#': switch (b) { case '+': case '-': case '*': case '/': case '(': return '<'; case '#': return '='; case ')': return FALSE; };break; } }

int isoptr (char op) { if (op=='+'||op=='-'||op=='*'||op=='/'||op=='('||op==')'||op=='#') return TRUE; return FALSE; }

main () { int a,b,op; char c,d; insert: printf ("Please input a expression:\n"); initstack (&optr); push (&optr,'#'); initstack (&opnd); scanf ("%c",&c); while (c!='#'||gettop(&optr)!='#') { if (isoptr(c)==FALSE) { push(&opnd,c); scanf ("%c",&c);} else switch (precede (gettop(&optr), c)) { case '<': push(&optr,c); scanf ("%c",&c); break; case '=': pop(&optr); scanf ("%c",&c); break; case '>': op=pop(&optr); b=pop(&opnd); a=pop(&opnd); push(&opnd,operate(a,op,b)); break; } } printf ("The answer is %d\n",gettop(&opnd)-48); printf ("\nPress any to continue and 'q' to quit\n\n"); d=getch(); if (d=='q') exit (); else goto insert;

}

[此贴子已经被作者于2004-09-24 15:30:49编辑过]

搜索更多相关的解决方案: 指教  发上  课程  设计  

----------------解决方案--------------------------------------------------------

ASCII为48的字符是什么?


----------------解决方案--------------------------------------------------------

大哥,能运行吗?

我看怎么好象有点问题:

好象没有一栈放数字啊?


----------------解决方案--------------------------------------------------------

绝对能用


----------------解决方案--------------------------------------------------------

48是‘0’啊,把字符转换成数字


----------------解决方案--------------------------------------------------------

转换成数字为什么又要加48?


----------------解决方案--------------------------------------------------------
你没有调过程序吗?这摇慢调的,
----------------解决方案--------------------------------------------------------

经不起 考验啊

强壮性差啊


----------------解决方案--------------------------------------------------------
  相关解决方案