请选择 进入手机版 | 继续访问电脑版

用c语言实现计算器(运用了栈和数组)

[复制链接]
云韵 发表于 2021-1-2 12:16:53 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题
使用c语言编写一个盘算器,这是这学期C语言课上lpj老师给我们摆设的大项目。
听上去非常容易的东西,实际上需要对栈和指针有一定的相识。一下是我的代码。
[code]在这里#include #include #include#define  end '\n'        ///开始界说数栈,包罗了函数声明typedef double ElemType;typedef struct node{        ElemType data;        struct node*next;}*linkStack, stackNode;//链栈初始化linkStack create(){        linkStack top = (linkStack)malloc(sizeof(stackNode));        if (!top)        {                printf("动态内存分配失败!\n");                exit(0);        }        else        {                top->next = NULL;                printf("数栈初始化乐成!\n");                return top;        }}//入栈int push(linkStack top, ElemType e){        if (top)        {                linkStack p = (linkStack)malloc(sizeof(stackNode));                p->data = e;                p->next = top->next;                top->next = p;                return 1;        }        return 0;}//出栈ElemType pop(linkStack st)                        //返回pop的元素值{        ElemType x;        linkStack p;        p = st;        x = st->next->data;        st->next = st->next->next;        return x;}//判定栈空int isEmpty(linkStack top){        if (top->next == NULL)                return 1;        return 0;}//获取栈顶元素double getTop(linkStack top){        if (top->next)        {                return top->next->data;        }        return -1;}///竣事界说数栈,以及函数声明///开始运算符栈的界说,以及其函数的声明typedef char ElemType2;typedef struct node2{        ElemType2 data;        struct node2*next;}*linkStack2, stackNode2;//链栈初始化linkStack2 create2(){        linkStack2 top = (linkStack2)malloc(sizeof(stackNode2));        if (!top)        {                printf("动态内存分配失败!\n");                exit(0);        }        else        {                top->next = NULL;                printf("运算符栈初始化乐成!\n");                return top;        }}//入栈int push2(linkStack2 top, ElemType2 e){        if (top)        {                linkStack2 p = (linkStack2)malloc(sizeof(stackNode2));                p->data = e;                p->next = top->next;                top->next = p;                return 1;        }        return 0;}//出栈ElemType2 pop2(linkStack2 st)                        //返回pop的元素值{        ElemType2 x;        linkStack2 p;        p = st;        x = st->next->data;        st->next = st->next->next;        return x;}//判定栈空int isEmpty2(linkStack2 top){        if (top->next == NULL)                return 1;        return 0;}//获取栈顶元素int getTop2(linkStack2 top){        if (top->next)        {                return top->next->data;        }        return -1;}//声明全局栈linkStack num;linkStack2 optr;char a[100][100];///竣事运算符栈的界说,以及其函数的声明//其他函数的声明double operate(double a, char t, double b);int judge(char a);double read(char *p);char precede(char t1, char t2);void fun(char*p1, char*p2);//其他函数的声明竣事int main(){        char c[100];        char *p1, *p2;        num = create();        optr = create2();        double result;        for (int i = 0, j = 0; i = '0'&&*p2 = '0'&&*p2 next->data != '#'))        {                if (judge(*p))                {                        switch (precede(optr->next->data, *p))                        {                        case'':                        {                                           t = pop2(optr);                                           b = pop(num);                                           c = pop(num);                                           push(num, operate(c, t, b));                        }                        }                }                else                {                        push(num, atof(p));                        i++;                }                if (*p != '#')                {                        p = a + i;                }        }        return getTop(num);}int judge(char a){        switch (a)        {        case'+':return 1;        case'-':return 1;        case'*':return 1;        case'/':return 1;        case'(':return 1;        case')':return 1;        case'#':return 1;        default:return 0;        }}double operate(double a, char t, double b){        double d;        switch (t)        {        case'+':        {                           d = a + b;                           break;        }        case'-':        {                           d = a - b;                           break;        }        case'/':        {                           d = a / b;                           break;        }        case'*':        {                           d = a*b;                           break;        }        }        return d;}char precede(char a, char b){        int i, j;        char pre[7][7] =                        //界说运算符之间的优先级        {                { '>', '>', '', '>', '', '>', '>', '>', '', '>' },                { '>', '>', '>', '>', '', '>' },                { '', '>' },                { '
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则


专注素材教程免费分享
全国免费热线电话

18768367769

周一至周日9:00-23:00

反馈建议

27428564@qq.com 在线QQ咨询

扫描二维码关注我们

Powered by Discuz! X3.4© 2001-2013 Comsenz Inc.( 蜀ICP备2021001884号-1 )