计算器堆栈实现

主要就是看这个函数!!!!CSPop

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<ctype.h>
#include<string.h>
#define MAXSIZE 100
#define ERROR -1
typedef struct CNode*PtrToCNode;
struct CNode
{
    char Data[1000];
    PtrToCNode Next;
};
typedef PtrToCNode CStack;
//初始化计算栈
CStack cstackinit()
{
    CStack S;
    S=(PtrToCNode)malloc(sizeof(struct CNode));
    S->Next=NULL;
    return S;
}
//判断是否为空
bool IsCSEmpty(CStack S)
{
    return(S->Next==NULL);
}
//压入
bool CSPush(CStack *S,char*Postfix)
{
    PtrToCNode tempt;
    tempt=(PtrToCNode)malloc(sizeof(struct CNode ));
    strcpy(tempt->Data,Postfix);
    tempt->Next=(*S)->Next;
    (*S)->Next=tempt;
    return true;
}
//弹出这里很容易出错!!!!!
char* CSPop(CStack *S)
{
    PtrToCNode C;
    char*re;
    re=(char*)malloc(1000*sizeof(char));
    C=(*S)->Next;
    strcpy(re,(*S)->Next->Data);
        (*S)->Next=C->Next;
        free(C);
    return re;
}
//无括号四则运算,思路是把+-看作数字放到堆栈里
char GetOp(char*expr, int*start,char*Postfix)
/*如果是数字和加减则写入栈,如果是运算符返回*/
{
    int j=0;
    if(isdigit(expr[(*start)]))//读入纯数字
    {
        while(isdigit(expr[(*start)]))
            Postfix[j++]=expr[(*start)++];
        //start指向不是数字的部分
        Postfix[j]='\0';//构成字符串
        return 'n';
    }
    switch(expr[(*start)++])
    {
        case '+':
        {
            Postfix[j]='+';
            Postfix[j+1]='\0';
            return 'n';}
        case '-':
        {
            Postfix[j]='-';
            Postfix[j+1]='\0';
            return 'n';}
        case '*':
            return '*';
        case '/':
        return '/';
        default:
            return expr[(*start)];
    }
}
//假设运算式子长度不超过100
int calculate()
{
    char string[MAXSIZE];
    int start=0,sum=0;
    CStack S;
    S=cstackinit();
    printf("请输入你的运算式子:\n");
    scanf("%s",string);
    while(start<=strlen(string))
    {
        char Postfix[1000];
        char re=GetOp(string,&start,Postfix);
        if(re=='*')
        {
            char tempt1[1000];
            GetOp(string,&start,tempt1);
            char tempt2[1000];
            sprintf(tempt2,"%d",atoi(CSPop(&S))*atoi(tempt1));
            CSPush(&S,tempt2);
        }
        else if(re=='/')
        {
            char tempt1[1000];
            GetOp(string,&start,tempt1);
            char tempt2[1000];
            sprintf(tempt2,"%d",atoi(CSPop(&S))/atoi(tempt1));
            CSPush(&S,tempt2);
        }
        else if(re=='n')
                CSPush(&S,Postfix);
        //我写的头昏好想死我快凋谢了
        else if (re=='\0')//结束算栈里面的
        {
            while((S->Next->Next)!=NULL)
            {
                char tempt3[1000];
                strcpy(tempt3,CSPop(&S));
                int k=atoi(tempt3);
                if(strcmp("+",CSPop(&S))==0)
                {
                    sum+=k;
                }
                else if(strcmp("-",CSPop(&S))==0)
                    sum+=(0-k);
            }
            sum+=atoi(CSPop(&S));
        }
    }
    return sum;
}
//老师我尽力了.......
int main()
{
    int result;
    result=calculate();
    printf("the result is %d\n",result);
}

 

#include <stdio.h>
#include<stdlib.h>
#include<stdbool.h>
#include<ctype.h>
#include<string.h>
#define MAXSIZE 100
#define ERROR -1
typedef struct CNode*PtrToCNode;
struct CNode
{
    char Data[1000];
    PtrToCNode Next;
};
typedef PtrToCNode CStack;
//初始化计算栈
CStack cstackinit()
{
    CStack S;
    S=(PtrToCNode)malloc(sizeof(struct CNode));
    S->Next=NULL;
    return S;
}
//判断是否为空
bool IsCSEmpty(CStack S)
{
    return(S->Next==NULL);
}
//压入
bool CSPush(CStack *S,char*Postfix)
{
    PtrToCNode tempt;
    tempt=(PtrToCNode)malloc(sizeof(struct CNode ));
    strcpy(tempt->Data,Postfix);
    tempt->Next=(*S)->Next;
    (*S)->Next=tempt;
    return true;
}
//弹出
void CSPop(CStack *S,char *re)
{
    PtrToCNode C;
        C=(*S)->Next;
    strcpy(re,(*S)->Next->Data);
        (*S)->Next=C->Next;
        free(C);
}
//无括号四则运算,思路是把+-看作数字放到堆栈里
char GetOp(char*expr, int*start,char*Postfix)
/*如果是数字和加减则写入栈,如果是运算符返回*/
{
    int j=0;
    if(isdigit(expr[(*start)]))//读入纯数字
    {
        while(isdigit(expr[(*start)]))
            Postfix[j++]=expr[(*start)++];
        //start指向不是数字的部分
        Postfix[j]='\0';//构成字符串
        return 'n';
    }
    switch(expr[(*start)++])
    {
        case '+':
        {
            Postfix[j]='+';
            Postfix[j+1]='\0';
            return 'n';}
        case '-':
        {
            Postfix[j]='-';
            Postfix[j+1]='\0';
            return 'n';}
        case '*':
            return '*';
        case '/':
        return '/';
        default:
            return expr[(*start)];
    }
}
//假设运算式子长度不超过100
int calculate()
{
    char string[MAXSIZE];
    int start=0,sum=0;
    CStack S;
    S=cstackinit();
    printf("请输入你的运算式子:\n");
    scanf("%s",string);
    while(start<=strlen(string))
    {
        char Postfix[1000];
        char re=GetOp(string,&start,Postfix);
        if(re=='*')
        {
            char tempt1[1000];
            GetOp(string,&start,tempt1);
            char tempt2[1000];
            char du[1000];
            CSPop(&S,du);
            sprintf(tempt2,"%d",atoi(du)*atoi(tempt1));
            CSPush(&S,tempt2);
        }
        else if(re=='/')
        {
            char tempt1[1000];
            GetOp(string,&start,tempt1);
            char tempt2[1000];
            char du[1000];
            CSPop(&S,du);
            sprintf(tempt2,"%d",atoi(du)/atoi(tempt1));
            CSPush(&S,tempt2);
        }
        else if(re=='n')
                CSPush(&S,Postfix);
        //我写的头昏好想死我快凋谢了
        else if (re=='\0')//结束算栈里面的
        {
            while((S->Next->Next)!=NULL)
            {
                char tempt3[1000];
                char ra[1000];
                CSPop(&S,ra);
                strcpy(tempt3,ra);
                int k=atoi(tempt3);
                CSPop(&S,ra);
                if(strcmp("+",ra)==0)
                {
                    sum+=k;
                }
                else if(strcmp("-",ra)==0)
                    sum+=(0-k);
            }
            char ra[1000];
            CSPop(&S,ra);
            sum+=atoi(ra);
        }
    }
    return sum;
}
//老师我尽力了.......
int main()
{
    int result;
    result=calculate();
    printf("the result is %d\n",result);
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值