前段時間利用棧寫了乙個實現了計算器功能的程式。覺得有意思的,因此今天在這了和大家分享一番。
首先,要寫出計算器,你要按照以下幾點去寫,才能保證運算的優先順序不發生錯誤。
v棧的應用舉例
n棧在表示式計算過程中的應用 :建立運算元棧和運算子棧。運算子有優先順序。規則:
n自左至右掃瞄表示式,凡是遇到運算元一律進運算元棧。
n當遇到運算子時,如果它的優先順序比運算子棧棧頂元素的優先順序高就進棧。反之,取出棧頂運算子和運算元棧棧頂的連續兩個運算元進行運算,並將結果存入運算元棧,然後繼續比較該運算子與棧頂運算子的優先順序。
n左括號一律進運算子棧,右括號一律不進運算子棧,取出運算子棧頂運算子和運算元棧頂的兩個運算元進行運算,並將結果壓入運算元棧,直到取出左括號為止。
有個error.c error.h的錯誤提示程式,方便知道錯誤所在,當然也可以用linux下的perror
perror(s) 用來將上乙個函式發生錯誤的原因輸出到標準裝置(stderr)。引數 s 所指的字串會先列印出,後面再加上錯誤原因字串。此錯誤原因依照全域性變數errno(這裡的說法不準確,errno是乙個巨集,該巨集返回左值) 的值來決定要輸出的字串。
在庫函式中有個errno變數,每個errno值對應著以字串表示的錯誤型別。當你呼叫"某些"函式出錯時,該函式已經重新設定了errno的值。perror函式只是將你輸入的一些資訊和現在的errno所對應的錯誤一起輸出。
//錯誤,提示
void myerror(char *str);
//另一種錯誤提示資訊
char * mystrerror(int num);
#endif
error.c
#include"error.h"
#include//提示出錯資訊
void myerror(char *str) }
char * mystrerror(int num)
}
sqstack.h
#ifndef __sqstack_h_
#define __sqstack_h_
#define size 100
#define true 1
#define false 0
#include"error.h"
typedef int stackdata;
typedef struct stack //數字棧·
stack;
typedef struct stack1 //符號棧
s;int initstack(stack *s);//分別是初始化兩個棧
int initstack1(s *s);
int stackempty(stack *s);//分別是判斷兩個棧是否為空
int stackempty1(s *s);
int stackfull(stack *s);//分別時判斷兩個棧是否滿
int stackfull1(s *s);
int push(stack *s,stackdata x);//兩個棧各自的進棧
int push1 (s*s,char x);
int pop(stack *s,stackdata *x);//兩個棧個子的出棧
int pop1(s *s,char *x);
int gettop(stack *s,stackdata *x);//分別為兩個棧的得到棧頂元素
int gettop1(s *s,char *x);
#endif
sqstack.c
#include"sqstack.h"
#include//#include"error.h"
int initstack(stack *s) //作為數字棧,初始化
s->top=-1;
}int initstack1(s *s) //作為符號棧,初始化
s->top=-1;
}int stackempty(stack *s) //判斷數字棧是否為空
return s->top==-1;
}int stackempty1(s *s) //判斷符號棧是否為空
return s->top==-1;
}int stackfull(stack *s) //判斷數字棧是否為滿
return s->top==size-1;
}int stackfull1(s *s) //判斷數字棧是否為空
return s->top==size-1;
}int push(stack *s,stackdata x) //數字棧進棧
if(stackfull(s)) //判斷有沒有滿
s->data[++s->top]=x;
return true;
}int push1 (s*s,char x) //符號棧進棧
if(stackfull1(s)) //判斷有沒有滿
s->data[++s->top]=x;
return true;
}int pop(stack *s,stackdata *x) //數字棧出棧
if(stackempty(s)) //判斷是否為空
*x=s->data[s->top--];
return true;
}int pop1(s *s,char *x) //符號棧出棧
if(stackempty1(s)) //判斷是否為空
*x=s->data[s->top--];
return true;
}int gettop(stack *s,stackdata *x) //得到數字棧棧頂元素
if(stackfull(s)) //判斷有沒有滿
if(stackempty(s)) //判斷是否為空
*x=s->data[s->top];
return true;
}int gettop1(s *s,char *x)//得到符號棧棧頂元素
if(stackfull1(s)) //判斷符號棧是否為滿
if(stackempty1(s)) //判斷符號棧是否為空
*x=s->data[s->top];
return true;
}
main.c
#include#include#include"sqstack.h"
int main()
if(stackempty1(&ch))
*/ for(i=0;i
乙個任意兩個超大位數加法
如果和上述四則運算結合,必定是乙個改進
#include#include#includeint main()
else
n1--;
n2--;
}
while(n1>=0) //哪個沒加完剩下的繼續
else
n1--;
} while(n2>=0)
else
n1--;
} printf("%s+%s的結果為:",s1,s2);
for(i=k-1;i>=0;i--) //最後輸出
printf("%d",s3[i]);
printf("\n");
return 0;
}
棧實現計算器(簡單四則運算)
主要是通過定義乙個數棧和乙個符號棧,並根據給出的計算式進行拆分,迴圈判斷是數字還是符號,考慮數字的連續性和符號計算的優先順序,具體實現如下 package com.pangzi.stucture public class calculator else else elseelse 讓index 1,...
python 計算器 四則運算
學習來自 感謝!思路 考慮的四則運算符號 獲取表示式字串 表示式切分 請注意區分 減號 與負號 先出初切 formula list i for i in re.split d d formula if i 然後再判定 if re.search final formula 1 其他正常切分就行 ite...
四則運算計算器
今天做個帶視窗的c 四則運算計算器 輸入中綴表示式 自然表示式 可以用list來放 先把它變成字尾表示式 逆波蘭表示式 用乙個棧放運算子,另乙個棧放字尾表示式 運算子優先順序 1 2 3 4 從左到右遍歷中綴表示式 計算字尾表示式 從左到右掃瞄字尾表示式,如果是數字,放入數字棧。如果是符號,從數字棧...