| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1126 人关注过本帖
标题:有关从中缀向后缀转换表达式的问题?无效内存引用?谁可以帮帮忙?
只看楼主 加入收藏
20072815
Rank: 1
等 级:新手上路
帖 子:87
专家分:0
注 册:2007-12-1
收藏
 问题点数:0 回复次数:1 
有关从中缀向后缀转换表达式的问题?无效内存引用?谁可以帮帮忙?
#define Size 500
#include<stdio.h>
char str[500];
char c;
int i;

typedef struct node{
    int top;            
    char no[Size];
 }  SqStack;


InitStack (SqStack *S) {
    S->top = -1;                       //建栈
 }


char GetTop (SqStack *S) {
    char c;
    if(S->top != -1)
    c=S->no[S->top];
    return (c);
 }



Push (SqStack *S, char c) {
    if(S->top==Size-1)
    printf("error\n");
    else {
    S->top++;
    S->no[S->top]=c;
    }
 }


Pop (SqStack *S, char *c) {
    if(S->top == -1) printf("error\n");
    else {
    *c=S->no[S->top];S->top--;
    }
 }


In(char c) {
    switch(c) {
    case'(':
    case')':
    case'*':
    case'+':                   //判断是数字符还是运算符
    case'-':
    case'/':
    case'#': return 0;break;
    default: return 1;break;
    }
 }

char Precede(char t1,char t2,SqStack *S) {               //运算符之间的判断
    char e,f;
    switch(t1)
    {
    case'+':
    case '-':if(t2=='*'||t2=='/'||t2=='-'||t2=='+')
    f='<';
    else
    f='>';
    break;

    case '*':
    case '/':if(t2=='#'||t2=='('||t2=='+'||t2=='-')
    f='>';
    else
    f='<';
    break;
                                                      
    case'(':  f='>'; break;
   
    case')': e=GetTop(S);
    c=str[i++];
    while(e!='(') {
    Pop(S,e);
    printf(" %c",e);
    e=GetTop(S);
    f='a';
    }
    if(e=='(') Pop(S,e);
    break;

    case'#': e=GetTop(S);
    while(e!='#') {
    Pop(S,e);
    printf(" %c",e);
    e=GetTop(S);
    f='a';
    }
    break;
   }
  return f;
 }


void SWITCH (char f,SqStack *S) {             //相当与switch,只是需要一个递归,所以写成了子函数
    char e;
    if(f=='<') {
    printf(" %c",Pop(S,e));
    SWITCH (Precede(c,GetTop(S),S),S);
    f='a';
    }
    if(f=='=') {
    Pop(S,e);
    c=str[i++];
    f='a';
    }
    if(f=='>') {
    Push(S,c);
    c=str[i++];
    f='a';
    }
 }



main()
 {  
    int k,N,num=0,flag;
    char e;
    SqStack *S;
    InitStack(S);
    scanf("%d",&N);
    getchar();
    for(k=0;k<N;k++) {
    Push(S,'#');
    gets(str);
    i=flag=0;
    c=str[i++];
    while(c!='#'||GetTop(S)!='#') {
    if(In(c)) {
    num=c-'0';
    c=str[i++];
    while(In(c)) {
    num=num*10+c-'0';
    c=str[i++];
    }
    }
    else {
    if(num!=0) {
    if(flag==0)
    {printf("%d",num); flag=1;}
    else printf(" %d",num);
    num=0;
    }
    SWITCH (Precede(c,GetTop(S),S),S);
    }
    }
    printf("\n");
    }
    getchar();
  }


输入:
3
(1)+2*3#
(1+2*3-4)#
1*2+(3)/4#
输出:
1 2 3 * +
1 2 3 * + 4 -
1 2 * 3 4 / +

编译的结果是出来下面一段:
main.c:11:Bounds error: NULL or ILLEGAL pointer used in component reference.
main.c:11:  Pointer value: NULL

[[it] 本帖最后由 20072815 于 2008-10-19 16:16 编辑 [/it]]
搜索更多相关主题的帖子: 内存 后缀 应用 表达 
2008-10-19 15:54
李登
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2010-10-14
收藏
得分:0 
我也是这个问题,好纠结啊!
2010-10-14 15:54
快速回复:有关从中缀向后缀转换表达式的问题?无效内存引用?谁可以帮帮忙?
数据加载中...
 
   



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

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