正常的表示式 逆波蘭表示式
a+b --->a,b,+
a+(b-c) ---> a,b,c,-,+
a+(b-c)*d ---> a,b,c,-,d,*,+
a+d*(b-c)--->a,d,b,c,-,*,+
a=1+3 ---> a,1,3,+,=
它的優勢在於只用兩種簡單操作,入棧和出棧就可以搞定任何普通表示式的運算。其運算方式如下:
如果當前字元為變數或者為數字,則壓棧,如果是運算子,則將棧頂兩個元素彈出作相應運算,結果再入棧,最後當表示式掃瞄完後,棧裡的就是結果。
在表示式中的轉換規則
運算元 :進棧
操作符 :1)進棧:
空棧優先順序高
棧頂是『( 』同時表示式不是『 )』
2)出棧並計算:
表示式符號的優先順序不高於棧頂符號
表示式為『 )』同時棧頂不為『( 』
表示式『\0』同時棧不為空
3)出棧但不計算:
表示式為『 )』同時棧頂為『( 』
標頭檔案
#ifndef _stacklink_h
#define _stacklink_h
#define success 10000
#define failure 10001
#define true 10002
#define false 10003
#includetypedef int elemtype;
struct node //結點的資訊
;typedef struct node node; //棧的資訊
struct stack
;typedef struct stack stack;
int linkinit(stack **s);
int linkempty(stack *s);
int push(stack **s, elemtype e);
int gettop(stack *s);
int pop(stack **s);
int clear(stack **s);
int destory(stack **s);
#endif
功能函式
#include"linkstack.h"
int linkinit(stack **s)
(*s) = (stack *)malloc(sizeof(stack) * 1 );
if( null == *s)
(*s) -> top = null;
(*s) -> count = 0;
return success;
}int linkempty(stack *s)
return( s -> top == null ) ? true : false;
}int push(stack **s, elemtype e)
node *p = (node *)malloc(sizeof(node));
if( null == p)
p->data = e; //哪幾個進棧了
p->next = (*s)->top;
(*s)->top = p;
(*s)->count++;
return success;
}int gettop(stack *s)
return s->top->data;
}int pop(stack **s)
node *p = (*s)->top;
elemtype e = (*s)->top->data;
(*s)->top = (*s)->top->next;
free(p);
(*s)->count--;
return e; //給e賦值,告知哪個出棧了}
int clear(stack **s)
node *p = (*s)->top;
while(p)
return success;
}int destory(stack **s)
free(*s);
(*s) = null;
return success;
}
棧內鍊錶基本功能
#include"linkstack.h"
#includeint main()
else
ret = linkempty(stack);
if(ret == true)
else if(ret == false)
else
for(i = 0; i < 10; i++)
else
}ret = gettop(stack);
if( ret == failure)
else
for(i = 0; i < 5; i++)
else
}ret = gettop(stack);
if( ret == failure)
else
ret = clear(&stack);
if( ret == success)
else
ret = gettop(stack);
if( ret == failure)
else
ret = destory(&stack);
if( ret == success)
else
for(i = 0; i < 10; i++)
else
}return 0;
}
計算機主函式
#include#include"linkstack.h"
int priority(char ch)
}int main()
; //存放表示式
int i = 0, tmp = 0, num1 = 0, num2 = 0;
if( linkinit(&s_opt) != success || linkinit(&s_num) != success )
printf("please input :\n");
scanf("%s", opt);
while( opt[i] != '\0' || linkempty(s_opt) != true) //表示式沒結束 或者 操作符棧不為空
}else //操作符
if( linkempty(s_opt) == true || (priority( opt[i] ) > priority(gettop(s_opt))) || (gettop(s_opt) == '(' && opt[i] != ')' )) //進棧
if( (opt[i] == '\0' && linkempty(s_opt) != true) ||
( opt[i] == ')' && gettop(s_opt) != '(' ) ||
(priority(opt[i]) <= priority(gettop(s_opt)))) //出棧計算
}} }
printf("%d\n", gettop(s_num));
return 0;
}
鏈棧實現簡單的計算器功能
輸入的格式限定有待完善 include include include includeusing namespace std const int inf 0x3f3f3f3f define ok 1 define error 0 typedef int status typedef struct s...
用C語言完成簡單的計算器功能 2
之前用switch語句完成了乙個簡單計算器的功能,下面我給大家用if語句和while迴圈語句再實現乙個簡單計算器的程式設計。要求 實現簡單的計算器,具體 如下 include 標頭檔案 void main else if a 減法操作 else if a 乘法操作 else if a 取整操作 el...
演算法 簡易綜合計算器(字尾表示式)棧
初始化兩個棧 運算子棧s1和儲存中間結果的棧s2 從左至右掃瞄中綴表示式 遇到運算元時,將其壓s2 遇到運算子時,比較其與s1棧頂運算子的優先順序 如果s1為空,或棧頂運算子為左括號 則直接將此運算子入棧 否則,若優先順序比棧頂運算子的高,也將運算子壓入s1 否則,將s1棧頂的運算子彈出並壓入到s2...