#include <stdio.h>
#include <stdlib.h>
#define MAX 20
//定義兩個棧,分別存放運算數和運算符
struct SNode_Num
{
int datas[MAX];
int top;
};
typedef struct SNode_Num OperateNum;
struct SNode_Symbol
{
char symbol[MAX];
int top;
};
typedef struct SNode_Symbol OperateSymbol;
//取出相應的數
int GetOperateNum(OperateNum *StackNum)
{
return StackNum->datas[StackNum->top];
}
//取出相應運算符
char GetOperateSymbol(OperateSymbol *StackSymbol)
{
return StackSymbol->symbol[StackSymbol->top];
}
//運算數進棧
void PushOperateNum(OperateNum *StackNum, int x)
{
StackNum->top++;
StackNum->datas[StackNum->top] = x;
}
//運算符進棧
void PushOperateSymbol(OperateSymbol *StackSymbol, char ch)
{
StackSymbol->top++;
StackSymbol->symbol[StackSymbol->top] = ch;
}
//運算數退棧
int PopOperateNum(OperateNum *StackNum)
{
int num;
num = StackNum->datas[StackNum->top];
StackNum->top--;
return num;
}
//運算符退棧
char PopOperateSymbol(OperateSymbol *StackSymbol)
{
char ch;
ch = StackSymbol->symbol[StackSymbol->top];
StackSymbol->top--;
return ch;
}
//判斷輸入的符號是否是四則運算符號
int IsOperateSymbolOrNum(char ch)
{
if(ch == '+' || ch == '-' || ch == '*'|| ch == '/' || ch == '\n') return 1;
else return 0;
}
//判斷符號的優先級
char Priority(char inputnum, char ch)
{
switch(inputnum)
{
//加減在同一個優先級上
case '+':
case '-':
{
if(ch == '+' || ch == '-') return '>';
else if(ch == '*' || ch == '/') return '<';
else return '>';
}
break;
//乘除在同一優先級
case '*':
case '/':
{
if(ch == '+' || ch == '-') return '>';
else if(ch == '*' || ch == '/') return '>';
else return '>';
}
break;
case '\n':
{
if(ch == '\n') return '=';
else return '<';
}
break;
}
}
//兩數運算
int Calculate(int num1, char ch, int num2)
{
int result;
switch(ch)
{
case '+':
result = num1 + num2;
break;
case '-':
result = num1 - num2;
break;
case '*':
result = num1 * num2;
break;
case '/':
result = num1 / num2;
}
return result;
}
//用於用戶輸入和計算結果
int MainCalc()
{
//主函數進行計算
OperateNum datas;
OperateSymbol symbol;
int num1, num2, result, num;
char ch, sign;
//初始化順序棧
datas.top=-1; //操作數棧頂指針
symbol.top=-1; //操作符棧頂指針
//把回車計算的操作符放在棧中
PushOperateSymbol(&symbol, '\n');
ch = getchar();
while((ch != '\n') || (GetOperateSymbol(&symbol) != '\n'))
{
if(!IsOperateSymbolOrNum(ch))
{
num = atoi(&ch); //將字符轉換爲整數
ch = getchar(); //獲取輸入
while(!IsOperateSymbolOrNum(ch))
{
num = num * 10 + atoi(&ch);
ch = getchar(); //當沒有輸入回車時,繼續獲取輸入
}
PushOperateNum(&datas, num);
}
else
{
//考慮第一個數是負數的情況
if(ch=='-'&&symbol.top==0&&datas.top==-1)PushOperateNum(&datas, 0);
switch(Priority(GetOperateSymbol(&symbol), ch))
{
//判斷優先級後進行計算
case '<':
PushOperateSymbol(&symbol, ch);
ch = getchar();
break;
case '=':
sign = PopOperateSymbol(&symbol);
ch = getchar(); //獲取輸入
break;
case '>':
sign = PopOperateSymbol(&symbol);
num2 = PopOperateNum(&datas);
num1 = PopOperateNum(&datas);
result = Calculate(num1, sign, num2);
PushOperateNum(&datas, result);
break;
}
}
}
result = GetOperateNum(&datas);
return result;
}
int main(int argc, char *argv[])
{
int result;
result = MainCalc();
printf("%d", result); //輸出結果
return 0;
}
C語言實現四則運算(小型計算器)
如果有更好的想法,隨時歡迎私我!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.