如何从键盘输入表达式给字符数组赋值
如题!一次输入整个表达式,以'.'结尾.
例如输入式子a+(b-c)*d.之后,
数组元素:a[0]=a ,a[1]=+ , ..., a[10]=.
然后输出:abc-d*+.
即将输入的中缀表达式输出为后缀表达式
自己写的程序如下:
(不能得到想要的结果,希望能帮忙修改一下)
程序代码:
#include "stdafx.h"
#include <process.h>
#include <malloc.h>
#include <math.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status;
//栈的顺序存储表示
typedef char SElemType; // 定义栈元素类型为_____字符(用来处理表达式)
#define maxsize 100 //定义数组元素个数
#define STACK_INIT_SIZE 100 // 存储空间初始分配量
#define STACK_INCREMENT 10 // 存储空间分配增量
typedef struct SqStack{
SElemType *base; // 在栈构造之前和销毁之后,base的值为NULL
SElemType *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}SqStack; // 顺序栈
//顺序栈的有关基本操作
void InitStack(SqStack &S)
{ // 构造一个空栈S
if(!(S.base=(SElemType *)malloc(STACK_INIT_SIZE*sizeof(SElemType))))
exit(OVERFLOW); // 存储分配失败
S.top=S.base;
S.stacksize=STACK_INIT_SIZE;
}
Status StackEmpty(SqStack S)
{ // 若栈S为空栈,则返回TRUE,否则返回FALSE
if(S.top==S.base)
return TRUE;
else
return FALSE;
}
void Push(SqStack &S,SElemType e)
{ // 插入元素e为新的栈顶元素
if(S.top-S.base>=S.stacksize) // 栈满,追加存储空间
{
S.base=(SElemType *)realloc(S.base,(S.stacksize+STACK_INCREMENT)*sizeof(SElemType));
if(!S.base)
exit(OVERFLOW); // 存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=STACK_INCREMENT;
}
*(S.top)++=e;
}
Status Pop(SqStack &S,SElemType &e)
{ // 若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR
if(S.top==S.base)
return ERROR;
e=*--S.top;
return OK;
}
void trans(char *exp,char post[])
//逆波兰算法,将中缀算术表达式exp转换成后缀表达式postexp
{
int i=0;
SqStack op;
InitStack(op); //建立运算符栈
while(*exp!='\0')
{
switch(*exp)
{
case '(': //判断为左括号
Push(op,*exp);
exp++;
break;
case ')': //判断为右括号
while(*op.top!='(')
{ //将栈中'('前面的运算符退栈并存放到post中
post[i++]=*op.top;
op.top--;
}
op.top--; //将'('退栈
exp++;
break;
case '+':
while(op.top!=op.base&&*op.top!='(')
{ //将栈中运算符出栈
post[i++]=*op.top;
op.top--;
}
op.top++; //栈空或栈顶为'('则进栈
*op.top=*exp;
exp++;
break;
case '*':
while(*op.top=='-'||*op.top=='*')
{ //将栈中运算符退栈并存放到post中
post[i++]=*op.top;
op.top--;
}
op.top++; //将'*'进栈
*op.top=*exp;
exp++;
break;
case '-':
while(*op.top!='-')
{ //将运算符入栈
op.top++;
*op.top=*exp;
exp++;
break;
}
post[i++]=*op.top;
op.top--;
break;
case '.':
while(op.top!=op.base)
{
post[i++]=*op.top;
op.top--;
}
post[i++]=*exp;
break;
default:
post[i++]=*exp;
exp++;
break;
}
}
}
int main(int argc, char* argv[])
{
int i=0;
//char *p=null;
char exp[maxsize]={NULL},post[maxsize]={NULL};
printf("请输入检索表达式:\n");
char *p=(char *)malloc(maxsize*sizeof(char));
scanf("%s",exp);
//for(i=0;i<maxsize;i++)
//while(p)
// exp[i++]=*(p++);
trans(exp,post);
printf("逆波兰变换后表达式为:\n");
for(i=0;i<maxsize;i++)
printf("%c",post[i]);
printf("Hello World!\n");
return 0;
}
[ 本帖最后由 混沌之灵 于 2010-11-2 23:57 编辑 ]






