如何从键盘输入表达式给字符数组赋值
如题!一次输入整个表达式,以'.'结尾.
例如输入式子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 编辑 ]