应天论坛

 找回密码
 参与我们

QQ登录

只需一步,快速开始

搜索
查看: 776|回复: 0

用栈写的计算机,拿出来分享

[复制链接]

276

主题

303

帖子

3187

积分

管理员

湘南小侠客

Rank: 9Rank: 9Rank: 9

积分
3187

优质服务勋章论坛元老

QQ
发表于 2017-8-13 14:58:00 | 显示全部楼层 |阅读模式
用栈写的计算机,拿出来分享

[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*
浮点结果+括号的计算机
作者:大路
*/
typedef struct stack
{
        float data[128];
        int top;
}Stack;

typedef struct stack2
{
        char data[128];
        int top;
}Stack2;


int Vni(char op)
{
        switch (op)
        {
                case '+':
                return 1;
                case '-':
                return 1;
                case '*':
                return 2;
                case '/':
                return 2;
                case '(':
                return 0;
                case ')':
                return 0;
        }
}




Stack* InitStack(void)
{
        Stack* p1;
        p1=malloc(sizeof(Stack));
        p1->top=-1;
        return p1;
}
Stack2* InitStack2(void)
{
        Stack2* p2;
        p2=malloc(sizeof(Stack2));
        p2->top=-1;
        return p2;
}

float Calculate(float a,char op,float b)
{
        switch (op)
        {
                case '+':
                return a+b;
                case '-':
                return a-b;
                case '*':
                return a*b;
                case '/':
                return a/b;
        }
}


float PopStack(Stack *p1)
{
        float c;
        c=p1->data[p1->top--];
        return c;       
}

void PushStack(Stack *p1,float a)
{
        p1->data[++p1->top]=a;
}

char PopStackCh(Stack2 *p2)
{
        char c;
        c=p2->data[p2->top--];
        return c;       
}





void PushStackCh(char ss,Stack* p1,Stack2* p2)
{
        char fuhao;
        float a,b;
        float answer;
        if (p2->top!=-1)
        {
                if (Vni(ss)<=Vni(p2->data[p2->top]))
                {
                        if (ss==')')
                        {
                       
                                while(p2->data[p2->top]!='(')
                                {
                               
                                        fuhao=PopStackCh(p2);
                                        b=PopStack(p1);
                                        a=PopStack(p1);
                                        answer=Calculate(a,fuhao,b);
                               
                                        PushStack(p1,answer);
                                }                               
                                p2->top=p2->top-1;
                        }
                        else if (ss=='(')
                        {
                                p2->data[++p2->top]=ss;
                        }
                        else
                        {
                                fuhao=PopStackCh(p2);
                                b=PopStack(p1);
                                a=PopStack(p1);
                                printf("计算了  %3.3f  %c %3.3f\n",a,fuhao,b);
                                answer=Calculate(a,fuhao,b);
                                PushStack(p1,answer);
                                p2->data[++p2->top]=ss;
                        }
                }
                else
                {
                        p2->data[++p2->top]=ss;
                }
        }
        else
        {
                p2->data[++p2->top]=ss;
        }
}








void jisuan(char *s,Stack *p1,Stack2 *p2)
{
        int i=0;
        float sum=0;
        float t=1;
        while(s!='\0')
        {
                if (s>='0'&&s<='9')
                {
                        do
                        {
                                sum=(float)(s-'0')+sum*10;
                                i++;
                                if (s=='.')
                                {
                                        do
                                        {
                                                i++;                                       
                                                t=0.1*t;
                                                sum+=(float)(s-'0')*t;
                                               
                                        }while(s>='0'&&s<='9');
                                        t=1;
                                }
                        }
                        while(s>='0'&&s<='9');
                        PushStack(p1,sum);
                        sum=0;
                        if (s=='\0')
                        {
                                break;
                        }
                }
                if (s=='+'||'-'||'*'||'/'||'('||')')
                {
                        PushStackCh(s,p1,p2);                       
                }
                else
                {
                        printf("input error hahahaha\n");
                }
                i++;
        }
}


int main()
{
        float a,b;
        char fuhao;
        char s[120];
        float answer;
        gets(s);
        Stack *p1;
        Stack2 *p2;
        p1=InitStack();
        p2=InitStack2();
        jisuan(s,p1,p2);
       
        while(p2->top!=-1)
        {
                fuhao=PopStackCh(p2);
                b=PopStack(p1);
                a=PopStack(p1);
                answer=Calculate(a,fuhao,b);
                PushStack(p1,answer);
        }
       
       
       
        printf("anwer is %3.3f\n",answer);

       
        return 0;
}

[/mw_shl_code]
每次见你穿短裤打领带,还穿个拖鞋,下次再这样穿不要从我家门口过了!
http://gsh.yzqz.cn/CassettePlayer/index.html

天之道,损有余而补不足.人之道则不然,损不足以奉有余.孰能有余以奉天下,唯有道者.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 参与我们

本版积分规则

QQ|Archiver|手机版|小黑屋|应天社区 ( 湘ICP备17015224号 )

GMT+8, 2024-4-25 18:23 , Processed in 0.765605 second(s), 27 queries .

Powered by Discuz!

© 2001-2017 Comsenz Inc.


免责声明:
本站所发布的第三方软件及资源(包括但不仅限于文字/图片/音频/视频等仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢某程序或某个资源,请支持正版软件及版权方利益,注册或购买,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To: admin@yzqz.cn

快速回复 返回顶部 返回列表