栈实现加减乘除

写的很麻烦,毕竟算是刚开始学,希望以后能写的又快又好。括号功能没加,数字位数大于1位的恐怕要加个函数转换了。

编译环境:vc++6.0

// demo1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include
#include
#include


/*
栈 实现 加减乘除运算
*/

typedef struct openStack{
    int  *top;
    int  *base;
    //栈的大小
    int stackSize;
}open;

typedef struct oprtStack{
    char  *top;
    char  *base;
    int stackSize;
}oprt;

//初始化栈
void initStack(oprt * oprt1);
void initStack(open * open1);
//获得栈的顶端元素
int getTop(open * open1);
int getTop(oprt * oprt1);
//进栈
void push(open *open1,int e);
void push (oprt *oprt1,char e);
//顶端出栈
int pop(open *open1);
char pop(oprt *oprt1);
//查看栈
void visit(oprt * oprt1);
void visit (open * open1);

int isExist(open *open1);
int isExist(oprt *oprt1);
//比较优先级与计算
int precede(char x,char y);
int operate(int a,char b,int c);

int main(int argc, char* argv[])
{
    char *str = (char *)malloc(100);
    char x='\0';
    int y = 0;
    int i = 0;
    int a,b,c;
    oprt * oprt1 = (oprt *)malloc(sizeof(oprt));
    //初始化两个栈
    oprt1->stackSize=-1;
    open * open1=(open *)malloc(sizeof(open));
    open1 ->stackSize =-1;
    printf("输入一段字符串:\n");
    //获取运算符
    gets(str);
    //printf("%s",str);
    //初始化
    initStack(oprt1);
    initStack (open1);
    //写入栈并运算
    while(*(str+i)!='#')
    {
        char flag = *(str+i);
        if(flag!='+'&&flag!='-'&&flag!='*'&&flag!='/')
        {
            //输入数字栈
            push(open1,flag-48);
        }
        else
        {    
            if(precede(getTop(oprt1),flag)>0)
            {
                char old = pop(oprt1);
                push(oprt1,flag);
                
                a=pop(open1);
                b=pop(open1);
                c=operate(a,old,b);
                push(open1,c);

            }
            else{
                push(oprt1,flag);
            }
        }
        printf("open:\n");
        visit(open1);
        printf("\n");
        printf("optr:\n");
        visit(oprt1);
        printf("\n");
        i++;
    }
    while(*oprt1->top!='#')
    {
        char old = pop(oprt1);
        a=pop(open1);
        b=pop(open1);
        c=operate(a,old,b);
        printf("c:%d\n",c);
        push(open1,c);
        printf("外open:\n");
        visit(open1);
        printf("\n");
        printf("外optr:\n");
        visit(oprt1);
        printf("\n");
    }
    
    return 0;
}




//初始化栈
void initStack(oprt * oprt1)
{
    if(oprt1->stackSize==-1)
    {    
        oprt1->base = (char *)malloc(sizeof(char));
        oprt1->top = oprt1->base;
        oprt1->stackSize =10;
        push(oprt1,'#');
        printf("oprt初始化成功\n");

    }
    else{
        printf("已存在!");
    }
}
void initStack(open * open1)
{
    if(open1->stackSize==-1)
    {
        open1->base =  (int *)malloc(100*sizeof(int));
        open1->top =open1->base;
        open1->stackSize = 10;
        //    open1->base = open1->top = (open *)malloc(sizeof(char));
        printf("open初始化成功\n");
    }
    else{
        printf("已存在!");    
    }
}
//获得栈的顶端元素
int getTop(open * open1)
{
    if(isExist(open1)==1)
    {
        int * i = open1->top;
        i--;
        return *i;
    }
    else{
        exit(0);
    }
    
}
int getTop(oprt * oprt1)
{
    if(isExist(oprt1)==1)
    {
        char * i = oprt1->top;
        i--;
        return *i;
    }
    else{
        exit(0);
    }
}
//进栈
void push(open *open1,int e)
{
    int longth = 10;
    if(open1->top-open1->base>=open1->stackSize)
    {
        printf("执行新增\n");
        //新分配增量
        open1->base = (int *)realloc(open1->base,(open1->stackSize+longth)*sizeof(int));
        //改变top
        open1->top = open1->top + open1->stackSize;
        //改变stacksize
        open1->stackSize +=longth;
    }
    //赋值
    *open1->top = e;
    printf("push success!\n");
    open1->top ++;
}
void push (oprt *oprt1,char e)
{   
    int longth = 10;
    if((oprt1->top-oprt1->base)>=(oprt1->stackSize))
    {
        printf("执行新增\n");
        oprt1->base=(char *)realloc(oprt1->base,(oprt1->stackSize+longth)*sizeof(char));//新分配增量
        oprt1->top=oprt1->base+oprt1->stackSize;
        oprt1->stackSize+=longth;
    }
    *oprt1->top++=e;
    printf("push success!\n");
    
}
//顶端出栈
int pop(open *open1)
{
    if(open1->top==open1->base)
    {
        printf("1:当前栈为空!");
        exit(0);
    }
    //获取顶端值,然后释放掉
    else{
        open1->top--;
        int e = *open1->top;
        return e;
    }

}
char pop(oprt *oprt1)
{
    if(oprt1->top==oprt1->base)
    {
        printf("2:当前栈为空!");
        return '#';
    }
    //获取顶端值,然后释放掉
    else{
        oprt1->top--;
        char e = *oprt1->top;
        return e;
    }
}
//查看栈
void visit(oprt * oprt1)
{
    char * oprt2;
    char * oprt3;
    int i=0;
    if(oprt1 !=NULL)
    {
        oprt2 = oprt1->base;
        oprt3 = oprt1->top;
        while(oprt3-oprt2>0)
        {
            printf("%c\t",*(oprt2++));
            i++;
        }

    }
    else{
        printf("超过!\n");
    }
    
}
void visit (open * open1)
{
    int * open2;
    int * open3;
    int i=0;
    if(open1 !=NULL)
    {
        open2 = open1->base;
        open3 = open1->top;
        while(open3-open2>0)
        {
            printf("%d\t",*(open2++));

            i++;
        }
    }
    else{
        printf("超过!\n");
    }
    
}
//是否为空
int isExist(open *open1)
{
    if((open1->stackSize) ==-1)
    {
        return -1;
    }
    else{
        return 1;
    }
    
}

int isExist(oprt *oprt1)
{
    if((oprt1->stackSize) ==-1)
    {
        return -1;
    }
    else{
        return 1;
    }
}

//比较优先级与计算

int precede(char x,char y)
{
    if(x=='#')
    {
        return -1;
    }
    else if(x==y)
    {
        return 1;
    }
    else if((x=='+'||x=='-') && (y=='*'||y=='/'))
    {
        return -1;
    }
}
int operate(int a,char b,int c)
{
    int w;
    switch(b)
    {
    case '+':
        w=c+a;
        return w;
        break;
    case '-':
        w=c-a;
        return w;
        break;
    case '*':
        w=c*a;
        return w;
        break;
    case '/':
        printf("a:%d\t",a);
        printf("c:%d\t",c);
        w=(c/a);
        return w;
        break;
    }
    return 0;
    
}


你可能感兴趣的:(练习)