棧實現計算器四則運算 乙個任意兩個超大位數加法

2021-08-07 05:03:31 字數 3961 閱讀 4508

前段時間利用棧寫了乙個實現了計算器功能的程式。覺得有意思的,因此今天在這了和大家分享一番。

首先,要寫出計算器,你要按照以下幾點去寫,才能保證運算的優先順序不發生錯誤。

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 從左到右遍歷中綴表示式 計算字尾表示式 從左到右掃瞄字尾表示式,如果是數字,放入數字棧。如果是符號,從數字棧...