#include <stdio.h>
#include <stdlib.h>
#define LENGTH 9999
#include "memory.h"
int Err=0;
void InToPost(char*, char*);
int Priority(char);
long long int PostToInt(char*);
long long int Cal(char, long long int, long long int);
long long
123
1 2 3
2012年11月24日 星期六
- #include <stdio.h>
- #include <stdlib.h>
- #define LENGTH 9999
- #include "memory.h"
- int Err=0;
- void InToPost(char*, char*);
- int Priority(char);
- long long int PostToInt(char*);
- long long int Cal(char, long long int, long long int);
- int main(void)
- {
- char Infix[LENGTH] = {'\0'};
- char Postfix[LENGTH]= {'\0'};
- int i;
- long long int val;
- scanf("%s", Infix);
- InToPost(Infix, Postfix);
- if(Err==1)
- {
- return 0;
- }
- for(i = 0; Postfix[i] != '\0'; i++)
- {
- }
- val=PostToInt(Postfix);
- if(Err==1)
- {
- return 0;
- }
- return 0;
- }
- void InToPost(char* Infix, char* Postfix)
- {
- char Stack[LENGTH] = {'\0'};
- int i, j, Stack_Top;
- int temp=0;
- for(i = 0; Infix[i] != '\0'; i++)
- {
- if(Infix[i]=='(')
- temp++;
- if(Infix[i]==')')
- temp--;
- if(temp<0)
- {
- Err = 1;
- return;
- }
- }
- if(temp!=0)
- {
- Err = 1;
- return;
- }
- for(i = 0, j = 0, Stack_Top = 0; Infix[i] != '\0'; i++)
- {
- if(i==0)
- {
- if(Infix[i]=='-')
- {
- Postfix[j++] = '-';
- i++;
- }
- else if(Infix[i]=='+')
- {
- Postfix[j++] = '+';
- i++;
- }
- else if(Infix[i]=='*' || Infix[i]=='/' || Infix[i]=='%')
- {
- Err = 1;
- return;
- }
- }
- switch(Infix[i])
- {
- case '(':
- if(Infix[i+1]=='*' || Infix[i+1]=='/' || Infix[i+1]=='%')
- {
- Err = 1;
- return;
- }
- Stack[++Stack_Top] = Infix[i];
- if(Infix[i+1]=='-')
- {
- Postfix[j++] = '-';
- i++;
- }
- break;
- case '+': case '-': case '*': case '/': case '%':
- if(Infix[i+1]=='*' || Infix[i+1]=='/' || Infix[i+1]=='%' || Infix[i+1]=='\0')
- {
- Err = 1;
- return;
- }
- while(Priority(Stack[Stack_Top]) >= Priority(Infix[i]))
- {
- if(Postfix[j-1]!=' ')
- {
- Postfix[j++] = ' ';
- }
- Postfix[j++] = Stack[Stack_Top--];
- }
- Postfix[j++] = ' ';
- Stack[++Stack_Top] = Infix[i];
- if(Infix[i+1]=='-')
- {
- if(Infix[i+2]=='+' || Infix[i+2]=='-')
- {
- Err=1;
- return;
- }
- Postfix[j++] = '-';
- i++;
- }
- if(Infix[i+1]=='+')
- {
- if(Infix[i+2]=='+' || Infix[i+2]=='-')
- {
- Err=1;
- return;
- }
- i++;
- }
- break;
- case ')':
- if(Infix[i+1]!='+' && Infix[i+1]!='-' && Infix[i+1]!='*' && Infix[i+1]!='/' && Infix[i+1]!='%' && Infix[i+1]!='\0'&& Infix[i+1]!=')')
- {
- Err = 1;
- return;
- }
- while(Stack[Stack_Top] != '(')
- {
- Postfix[j++] = ' ';
- Postfix[j++] = Stack[Stack_Top--];
- }
- Stack_Top--;
- break;
- default:
- if(Infix[i]>57 || Infix[i]<48)
- {
- Err = 1;
- return;
- }
- Postfix[j++] = Infix[i];
- }
- }
- while(Stack_Top > 0)
- {
- Postfix[j++] = ' ';
- Postfix[j++] = Stack[Stack_Top--];
- }
- }
- int Priority(char op)
- {
- switch(op)
- {
- case '+': case '-':
- return 1;
- case '*': case '/': case '%':
- return 2;
- default:
- return 0;
- }
- }
- long long int PostToInt(char* Postfix)
- {
- char temp[9999] = {'\0'};
- long long int stack[LENGTH] = {'\0'};
- int top, i, j;
- for(top = 0, i = 0; Postfix[i] != '\0'; i++)
- switch(Postfix[i])
- {
- case '+': case '-':
- if(Postfix[i+1]>47 && Postfix[i+1]<58)
- {
- for(j = 0; Postfix[i] != ' '; i++, j++)
- {
- temp[j] = Postfix[i];
- }
- stack[++top] = atoll(temp);
- memset(temp, '\0', sizeof(temp));
- break;
- }
- stack[top - 1] = Cal(Postfix[i], stack[top - 1], stack[top]);
- top--;
- break;
- case '/': case '%':
- if(stack[top]== 0)
- {
- Err=1;
- return 0;
- }
- stack[top - 1] = Cal(Postfix[i], stack[top - 1], stack[top]);
- top--;
- break;
- case '*':
- stack[top - 1] = Cal(Postfix[i], stack[top - 1], stack[top]);
- top--;
- break;
- case ' ':
- break;
- default:
- for(j = 0; Postfix[i] != ' '; i++, j++)
- {
- temp[j] = Postfix[i];
- }
- stack[++top] = atoll(temp);
- memset(temp, '\0', sizeof(temp));
- }
- return stack[top];
- }
- long long int Cal(char op, long long int N1, long long int N2)
- {
- switch(op)
- {
- case '+':
- return N1 + N2;
- case '-':
- return N1 - N2;
- case '*':
- return N1 * N2;
- case '/':
- return N1 / N2;
- case '%':
- return N1 % N2;
- }
- return 0;
- }
訂閱:
文章 (Atom)