| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 472 人关注过本帖
标题:求指点,不知道哪里有问题
只看楼主 加入收藏
圣雄南丁格尔
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2013-5-10
结帖率:0
收藏
已结贴  问题点数:20 回复次数:2 
求指点,不知道哪里有问题
#include<stdio.h>
#include<stdlib.h>

//运算符栈
typedef struct node
{
    char data;
    struct node *next;
}LinkStackNode, *LinkStack;
//运算数栈
typedef struct Node
{
    int data;
    struct Node *next;
}LinkNode,*Link;

//初始化
void InitStack_op(LinkStack *top)
{
    *top = (LinkStack)malloc(sizeof(LinkStackNode));
    (*top)->next = NULL;
}
void InitStack_ov(Link *top)
{
    *top = (Link)malloc(sizeof(LinkNode));
    (*top)->next = NULL;
}
// 进栈
int Push_op(LinkStack top,char x)
{
    LinkStackNode * temp;
    temp = (LinkStackNode *)malloc(sizeof(LinkStackNode));
    if(temp == NULL)
        return 0;
    temp->data = x;
    temp->next = top->next;
    top->next = temp;
    return 1;
}

int Push_ov(Link top,int x)
{
    LinkNode *temp;
    temp = (LinkNode *)malloc(sizeof(LinkNode));
    if(temp == NULL)
        return 0;
    temp->data = x;
    temp->next = top->next;
    top->next = temp;
    return 1;
}
//出栈
int Pop_op(LinkStack top, char *x)
{
    LinkStackNode * temp;
    temp = top->next;
    if(temp == NULL)
        return 0;
    top->next = temp->next;
    *x = temp->data;
    free(temp);
    return 1;
}
int Pop_ov(Link top, int *x)
{
    LinkNode * temp;
    temp = top->next;
    if(temp ==NULL)
        return 0;
    top->next = temp->next;
    *x = temp->data;
    free(temp);
    return 1;
}
//判断输入字符是否为运算符
int In(char x)
{
    if(x == '+' || x == '-' || x == '*' || x == '/' || x == '#' || x == '(' || x ==')')
        return 1;
    return 0;
}
//获取栈顶元素
char GetTop_op(LinkStack top)
{
    return top->next->data;
}
int GetTop_ov(Link top)
{
    return top->next->data;
}
//运算操作
int Execute(int a, char op,int b)
{
    int i = 0;
    switch(op)
    {
    case '+':
        i = a + b;
        break;
    case '-':
        i = a - b;
        break;
    case '*':
        i = a * b;
        break;
    case '/':
        if(b == 0)
        {
            printf("错误,除数不能为0!\n");
            break;
        }
        i = a / b;
    default:
        break;
    }
    return i;
}
//字符转化为数字
int GetNumber(char &ch)
{
    return atoi(&ch);
}
//比较栈顶运算符的优先级

char Compare(char s,char c)
{
    switch(s)
    {
    case '+':
    case '-':
        {
            if(c=='+'||c=='-')
                return '>';
            else if (c=='*'||c=='/')
                return '<';
            else if(c=='(')
                return '<';
            else if(c==')')
                return '>';
            else
                return '>';
        }
        break;
    case '*':
    case '/':
        {
            if(c=='+'||c=='-')
                return '>';
            else if (c=='*'||c=='/')
                return '>';
            else if(c=='(')
                return '<';
            else if(c==')')
                return '>';
            else
                return '>';
        }
        break;
    case '(':
        {
            if(c==')')
                return '=';
            else
                return '<';
        }
        break;
    case ')':
        return '>';
        break;
    }
}

int main(void)
{
    LinkStack OPTR;
    Link OVS;
    InitStack_op(&OPTR);
    InitStack_ov(&OVS);
    char ch,op;
    int a,b,v,n;
    Push_op(OPTR,'#');
    printf("\n请输入一个表达式串(以 # 结尾):");
    ch = getchar();
    while(ch != '#' || GetTop_op(OPTR) != '#')
    {
        if(!In(ch))
        {
            n = GetNumber(ch);
            Push_ov(OVS,n);
        }
        else
            switch(Compare(GetTop_op(OPTR),ch))
        {
            case '<':
                Push_op(OPTR,ch);
                ch = getchar();
                break;
            case '>':
                Pop_ov(OVS, &b);
                Pop_ov(OVS, &a);
                Pop_op(OPTR,&op);
                v = Execute(a,op,b);
                Push_ov(OVS,v);
                break;
            case '=':
                Pop_ov(OVS, &b);
                Pop_ov(OVS, &a);
                Pop_op(OPTR,&op);
                v = Execute(a,op,b);
                Push_ov(OVS,v);
                break;
        }
    }
    v = GetTop_ov(OVS);
    printf("结果为:\n",v);
    return 0;
}
搜索更多相关主题的帖子: next void include 
2013-05-10 19:15
邓士林
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:淮河河畔
等 级:贵宾
威 望:61
帖 子:2392
专家分:13384
注 册:2013-3-3
收藏
得分:10 
刚才给你编译下,让我电脑都死机了,其实你可以用字符串或者字符数组、字符指针存储表达式,然后对其进行处理

Maybe
2013-05-10 21:47
pauljames
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:千里冰封
威 望:9
帖 子:1555
专家分:10000
注 册:2011-5-8
收藏
得分:10 
用栈实现表达式求值?可以看看别人怎么实现的,数据结构基础C语言版上有

经常不在线不能及时回复短消息,如有c/单片机/运动控制/数据采集等方面的项目难题可加qq1921826084。
2013-05-12 08:07
快速回复:求指点,不知道哪里有问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050898 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved