本文共 4233 字,大约阅读时间需要 14 分钟。
#include<stdio.h>#include<stdlib.h>#include"FloatStack.cpp"#define ElemType char#define MAXSIZE 50struct Stack{ ElemType data[MAXSIZE]; int top;};typedef Stack *SqStack;//void initStack(SqStack &st);int isEmpty(SqStack &st);int push(SqStack &st,ElemType e);int pop(SqStack &st,ElemType *e);void output(SqStack &st);void arrayPointer(char *p);void trans(char *exp, char *postexp);float compvalue(char *postexp);/void testTrans(){ char arrs[50] = "(56-20)/(10+2)"; char arrstwo[50]; char *exp,*postexp; float f; exp=arrs; postexp=arrstwo; trans(exp,postexp); arrayPointer(arrs); arrayPointer(postexp); f=compvalue(postexp); printf("%f",f); }void testArrayPointer(){ char charArry[] ="fjdsalfjlsajf"; char *p; p=charArry; arrayPointer(p);}void testStack(){ SqStack st; Stack stackObject; st=&stackObject; initStack(st); push(st,'z'); output(st); // output(st);}void main(){ //testStack(); // testArrayPointer(); testTrans();}/*** 初始化堆栈**/void initStack(SqStack &st){ st->top=-1; // 空栈}/*** 堆栈是否为空* 空 1* 非空 0*/int isEmpty(SqStack &st){ return(st->top==-1);}/*** 进栈**/int push(SqStack &st,ElemType e){ // 是否满 if(st->top==(MAXSIZE-1)) return 0; st->top++; //要先加加 st->data[st->top] = e; //printf("%c",st->data[st->top]); return 1;}/*** 出栈**/int pop(SqStack &st,ElemType *e){ if(st->top==-1) // 是否为空 return 0; *e = st->data[st->top]; st->top--; return 1;}/*** 获得栈顶的值,但是不会 pop**/int get(SqStack &st,ElemType *e){ if(st->top==-1) return 0; *e=st->data[st->top]; return 1;}void output(SqStack &st){ ElemType elem,*e; e=&elem; while(!isEmpty(st)) { pop(st,e); printf("%2c",*e); } printf("/n");}/*** 测试数组指针*/void arrayPointer(char *p){ while(*p!='/0') { printf("%2c",*p); p++; } printf("/n");}/*** 将表达式转换成后缀表达式* (56-20)/(10+2)*/void trans(char *exp, char *postexp){ // 建立堆栈 printf("(56-20)/(10+2)=%d/n",(56-20)/(10+2)); SqStack st; Stack stackObject; st=&stackObject; initStack(st); char temp,*ch; ch=&temp; while(*exp!='/0') //读取 { switch(*exp) { case '(': // 左括号 push(st,*exp); // 进栈 break; case ')': // get(st,ch); while(*ch!='(') { pop(st,ch); *postexp = *ch; // 把值放进去 postexp++; get(st,ch); } pop(st,ch); // 去除栈里面的 '(' // printf("%c",*ch); break; case '+': case '-': get(st,ch); while(*ch!='(' && !isEmpty(st)) // 不空且不等于 '(' { pop(st,ch); // 出栈 *postexp = *ch; // 存入 postexp++; } push(st,*exp);// *exp 进栈 break; case '*': case '/': get(st,ch); while(*ch!='(' && !isEmpty(st) && *ch=='*' || *ch=='/') // 不空且不等于 '(' { pop(st,ch); // 出栈 *postexp = *ch; // 存入 postexp++; } push(st,*exp);// *exp 进栈 break; case ' ': // 过滤空格 break; default: while(*exp>='0' && *exp<='9') { *postexp = *exp; postexp++; exp++; // 在此加 1 } *postexp = '#'; postexp++; exp--; }// switch exp++;// 在此加 1 }// while // 此时 exp 扫描完毕,栈不空出将所有数字出栈,并保存在 postexp中 while(!isEmpty(st)) { pop(st,ch); *postexp = *ch; postexp++; } *postexp = '/0';}/*** 求后缀表达式 56#20#-4#2#+-的值**/float compvalue(char *postexp){ FloatStack obj; FStack fst; fst=&obj; initStackFloat(fst); float floatValue; float temp,*f; f = &temp; float temptwo,*ft; ft = &temptwo; float resultFloat,*rf; rf = &resultFloat; while(*postexp!='/0') { switch(*postexp) { case '+': popFloat(fst,f); popFloat(fst,ft); resultFloat = *ft + *f; pushFloat(fst,resultFloat); postexp++; break; case '-': popFloat(fst,f); popFloat(fst,ft); resultFloat = *ft - *f; // 相减,可能有位置问题 pushFloat(fst,resultFloat); postexp++; break; case '*': popFloat(fst,f); popFloat(fst,ft); resultFloat = *ft * *f; pushFloat(fst,resultFloat); postexp++; break; case '/': getFloat(fst,f); if(*f!=0) { popFloat(fst,f); popFloat(fst,ft); resultFloat = *ft / *f; pushFloat(fst,resultFloat); postexp++; } else { printf("/n/t除数不能为零%f",*f); return 0; } break; default: floatValue=0; while(*postexp>='0' && *postexp<='9') // 将字符转换为数字存放到 { floatValue = 10*floatValue + (*postexp) - '0'; postexp++; } pushFloat(fst,floatValue);// 进栈 if(*postexp == '#') postexp++; }// switch }// while popFloat(fst,f); return *f;}
转载地址:http://tazni.baihongyu.com/