|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <stdio.h>
- #include <stdlib.h>
- #define STACK_INIT_SIZE 20
- #define STACKINCREMENT 10
- typedef char ElemType;
- typedef struct
- {
- ElemType *base;
- ElemType *top;
- int stackSize;
- }sqStack;
- InitStack(sqStack *s)
- {
- s->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
- if( !s->base )
- exit(0);
- s->top = s->base;
- s->stackSize = STACK_INIT_SIZE;
- }
- Push(sqStack *s, ElemType e)
- {
- // 栈满,追加空间,鱼油必须懂!
- if( s->top - s->base >= s->stackSize )
- {
- s->base = (ElemType *)realloc(s->base, (s->stackSize + STACKINCREMENT) * sizeof(ElemType));
- if( !s->base )
- exit(0);
- s->top = s->base + s->stackSize;
- s->stackSize = s->stackSize + STACKINCREMENT;
- }
- *(s->top) = e; // 存放数据
- s->top++;
- }
- void Pop(sqStack *s, ElemType *e)
- {
- if( s->top == s->base )
- return;
- *e = *--(s->top); // 将栈顶元素弹出并修改栈顶指针
- }
- int StackLen(sqStack s)
- {
- return (s.top - s.base);
- }
- int main()
- {
- sqStack s;
- char c, e;
- InitStack( &s );
- printf("请输入中缀表达式,以#作为结束标志:");
- scanf("%c", &c);
- while( c != '#' )
- {
- while( c>='0' && c<='9' )
- {
- printf("%c", c);
- scanf("%c", &c);
- if( c<'0' || c>'9' )
- {
- printf(" ");
- }
- }
- if( ')' == c )
- {
- Pop(&s, &e);
- while( '(' != e )
- {
- printf("%c ", e);
- Pop(&s, &e);
- }
- }
- else if( '+'==c || '-'==c )
- {
- if( !StackLen(s) )
- {
- Push(&s, c);
- }
- else
- {
- do
- {
- Pop(&s, &e);
- if( '(' == e )
- {
- Push(&s, e);
- }
- else
- {
- printf("%c ", e);
- }
- }while( StackLen(s) && '('!=e );
- Push(&s, c);
- }
- }
- else if( '*'==c || '/'==c || '('==c )
- {
- Push(&s, c);
- }
- else if( '#'== c )
- {
- break;
- }
- else
- {
- printf("\n出错:输入格式错误!\n");
- return -1;
- }
- scanf("%c", &c);
- }
- while( StackLen(s) )
- {
- Pop(&s, &e);
- printf("%c ", e);
- }
- return 0;
- }
复制代码 这是中缀表达式转化为后缀表达式的程序,可是有些问题如图,输入1*2/3#之后后缀表达式不是应为1 2 * 3 / 吗,乘除优先级相同
结果没问题。题主可以再熟悉熟悉逆波兰表达式的具体表示方法。
1 2 3 / * 此表达式的分解为:先进行2/3的计算,再进行1*(2/3),算出最终结果。
附例子进行解释: a b c - + 此表达式表示的是:a+(b-c)
所以,小甲鱼的源代码是没有问题的。
|
|