#include <stdio.h>
#include <stdlib.h>
#include<ctype.h>
//運算子堆疊
typedef struct SChar{
char data;
struct SChar *next;
}SChar, *LinkStack;
//運算元堆疊
typedef struct SNum{
float data;
struct SNum *next;
}SNum, *LinkStack2;
//char初始化
LinkStack InitChar(){
return NULL;
}
//char入堆疊
LinkStack PushChar(LinkStack pTop, char e){
SChar *S =(LinkStack)malloc(sizeof(SChar));
S->data = e;
S->next = pTop;
pTop = S;
return pTop;
}
//char出堆疊
LinkStack PopChar(LinkStack pTop, char *e){
if(pTop == NULL)
printf("堆疊為空堆疊!\n");
*e = pTop->data;
LinkStack p = pTop;
pTop = pTop->next;
free(p);
return pTop;
}
//num初始化
LinkStack2 InitNum(){
return NULL;
}
//num入堆疊
LinkStack2 PushNum(LinkStack2 pTop, float e){
SNum *S =(LinkStack2)malloc(sizeof(SNum));
S->data = e;
S->next = pTop;
pTop = S;
return pTop;
}
//num出堆疊
LinkStack2 PopNum(LinkStack2 pTop, float *e){
if(pTop == NULL)
printf("堆疊為空堆疊!\n");
*e = pTop->data;
LinkStack2 p = pTop;
pTop = pTop->next;
free(p);
return pTop;
}
float Cal(char a,float b,float c)//運算函式,a為運算子,b、c分別為兩數
{
float r=0;
switch(a)
{
case '+':
r = b+c;
break;
case '-':
r = b-c;
break;
case '*':
r = b*c;
break;
case '/':
if(c!=0)
r = b/c;
break;
}
return r;
}
//中綴運算式求值
void Count(char *str){
char *p = str;
char e;
float f, num=0,temp=0;
LinkStack s = NULL;
LinkStack2 q = NULL; //s寄存OPTR(運算子),q寄存OPND(運算元)
s = InitChar();
q = InitNum();
s = PushChar(s, '#');
while((*p)!='\n'){
//讀入運算元
//若數堆疊為空,則直接壓入;若不為空,判斷符號堆疊top元素:符號堆疊為‘*’、‘/’時數計算,否則壓入
if(isdigit(*p)){
temp = (float)*p - '0';
if(isdigit(*(++p))){
temp = temp* 10 + (float)(*p) - '0';
}else
p--;
if(!q)
q = PushNum(q, temp);
else if(s->data == '*' || s->data =='/'){
s = PopChar(s, &e);
num = Cal(e,q->data,temp);
q = PopNum(q, &f);
q = PushNum(q, num);
} else
q = PushNum(q, temp);
}
//讀入運算子,
else{
if(s->data == '#')
s = PushChar(s,*p);
else if(*p == '+' || *p == '-') {
if(s->data != '('){
s = PopChar(s, &e);
q = PopNum(q, &f);
num = Cal(e ,q->data,f);
q = PopNum(q, &f);
q = PushNum(q, num);
}
s = PushChar(s, *p);
}
else if(*p == ')') {
s = PushChar(s, *p);
while(s->data != '('){
if(s->data == ')')
s = PopChar(s, &e);
s = PopChar(s, &e);
q = PopNum(q, &f);
num = Cal(e,q->data,f);
q = PopNum(q, &f);
q = PushNum(q, num);
}
s = PopChar(s, &e);
}
else if(*p == '*' || *p == '/' ){
if(s->data == '*'|| s->data =='/'){
s = PopChar(s, &e);
q = PopNum(q, &f);
num = Cal(e,q->data,f);
q = PopNum(q, &f);
q = PushNum(q, num);
}
s = PushChar(s, *p);
}
else if(*p == '(')
s = PushChar(s, *p);
}
p++;
}
while(s->data != '#'){
q = PopNum(q, &f);
num = Cal(s->data, q->data, f);
if(q->next)
q = PopNum(q, &f);
q = PushNum(q, num);
s = s->next;
}
num = q->data;
printf("%.2f\n",num);
}
//中綴運算式轉后綴
void Conversion(char *str){
char *p = str;
char e;
LinkStack top = NULL;
top = InitChar();
while(*p!= '\n'){
//數字直接列印
if(isdigit(*p)){
char *t = p;
if(isdigit(*(++p)))
printf("%c%c ",*t,*p);
else {
p--;
printf("%c ", *p);
}
}
//堆疊空,則直接壓入
if(!top && !isdigit(*p)){
top = PushChar(top,*p);
}
//堆疊非空
else{
if(*p=='+' || *p=='-'){
//堆疊非空,由于‘+’‘-’為最低優先級,沒有括號的情況下,堆疊中已有元素彈出并列印
while(top && top->data != '+' && top->data!= '-'&& top->data!='('){
top = PopChar(top,&e);
printf("%c ",e);
}
top = PushChar(top, *p); //壓入這個符號
}
if(*p=='*' || *p=='/' ){
while(top->data !='+' && top->data !='-' && top->data != '(' ){
top = PopChar(top,&e);
printf("%c ",e);
if(!top)
break;
}
top = PushChar(top, *p);
}
if(*p=='(')
top = PushChar(top, *p);
if(*p==')'){
while(top->data != '('){
top = PopChar(top,&e);
printf("%c ",e);
}
top = PopChar(top, &e); //將‘(’彈出
}
}
p++;
}
while(top){
top = PopChar(top,&e);
printf("%c ",e);
}
}
int main() {
char ch2[200];
fgets(ch2, sizeof(ch2), stdin);
Count(ch2);
Conversion(ch2);
}
在編譯器沒問題。。oj一直runtime error 實在沒法了 求助
感謝
uj5u.com熱心網友回復:
//num出堆疊
LinkStack2 PopNum(LinkStack2 pTop, float *e){
if (pTop == NULL)
{
printf("堆疊為空堆疊!\n");
pTop = new SNum; //xx
return pTop; //xx
}
*e = pTop->data;
LinkStack2 p = new SNum;
pTop = pTop->next;
free(p);
return pTop;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/108729.html
標籤:C語言
上一篇:大神們 這個程度應該怎么撰寫
下一篇:c++
