注册 登录
编程论坛 数据结构与算法

表达式求值问题

z6439186 发布于 2012-05-14 14:47, 443 次点击
#include <stdio.h>
#include <conio.h>
#include <malloc.h>
#include <stdlib.h>
#define error 0;
#define True  1;
#define size 100;
#define addsize 10
typedef struct
{
    char *top;
    char *base;
    int stacksize;
}sqstack;
int initstack(sqstack &s)//建立
{
    s.base=(char *)malloc(sizeof(char));
    if(!s.base)
        return error;
    s.top=s.base;
    s.stacksize=size;
}
int push(sqstack &s,char e)
{
    if(s.top-s.base>=s.stacksize)
    {
        s.base=(char *)realloc(s.base,(s.stacksize+addsize)*sizeof(char));
        if(!s.base)
            return error;
    }
    s.top=s.base+s.stacksize;
    *s.top++=e;
    s.stacksize+=addsize;
}
char pop(sqstack &s)
{
    if(s.base=s.top)
        return error;
       char m;
       m=*--s.top;
       return m;
}
char gettop(sqstack s)//为什么这不用&s啊,如果是s,那传递的是什么值呢,s是什么,难道不是栈吗?
{  char x;
    if(s.base=s.top)
        return error;
   x=*(s.top-1);//不需要改变S。TOP的值
       return x;
}
char m[6][6]=
{{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>''>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=',' '},{'>','>','>','>',' ','>','>'},{'<','<','<','<','<',' ','='}};//为什么这编译不行啊,说值太多了
int In(char x)
{
    switch(x)
    {
    case '+':return 1;
        case '-':return 1;
        case '*':return 1;
            case '/':return 1;
                case '(':return 1;
                    case ')':return 1;
                        case '#':return 1;
                        default:return 0;
    }
}
int sswitch(char x)
{
    int m;
    switch(x)
    {
       case '+':return 0;
        case '-':return 1;
        case '*':return 2;
            case '/':return 3;
                case '(':return 4;
                    case ')':return 5;
                        case '#':return 6;
    }
}
char pan(char x,char y)
{
  int i,j;
  i=sswitch(x);
  j=sswitch(y);
  return m[i][j];
}
int preccd(char m,char eta,char n)
{
    int i,j;
    i=atoi(&m);//为什么不是m啊,为什么药加地址符
    j=atoi(&n);
    switch(eta)
    {
    case '+':return i+j;
    case '-':return i-j;
    case '*':return i*j;
    case '/':return i/j;
    }

}
char qiuzhi()
{
    sqstack optr,opnd;//操作数,操作符
    initstack(optr);
    initstack(opnd);
    char a,b,eta,c;
    push(opnd,'#');//为什么我这用&opnd就不行呢,后面的也是一样,是什么意思呢
    c=getchar();
    while(c!='#'||gettop(opnd)!='#')
    {
        if(!In(c))
        {
            push(optr,c);
        c=getchar();
        break;
        }
        else
            switch(pan(gettop(opnd),c))
        {
            case '<':push(opnd,c);c=getchar();
            case '=':pop(opnd);c=getchar();
            case '>':a=pop(optr);
                b=pop(optr);
                eta=pop(opnd);
                push(optr,(char)preccd(a,eta,b));
        }
    }
return gettop(optr);
   
}
void main()
{
    int m;
    m=(int)qiuzhi();
    printf("%d",m);
}
希望大神告诉我下,谢谢了
5 回复
#2
寒风中的细雨2012-05-15 12:27
&  这个 是c++里的引用
#3
z64391862012-05-15 12:41
能不能说详细点啊,按我问的问题
#4
寒风中的细雨2012-05-15 12:42
回复 3楼 z6439186
会c++吗?

没用过    就改用c风格的    =》  指针



#5
JJ是也2012-05-19 22:20
char m[6][6]=
{{'>','>','<','<','<','>','>'},{'>','>','<','<','<','>','>'},{'>''>','>','>','<','>','>'},{'>','>','>','>','<','>','>'},{'<','<','<','<','<','=',' '},{'>','>','>','>',' ','>','>'},{'<','<','<','<','<',' ','='}};//为什么这编译不行啊,说值太多了

这个是6行6列的数组。。你输入的数据已经是7行7列的了
#6
z64391862012-05-20 14:31
能告诉我其他问题吗?谢谢了,那个没看到
1