棧內鍊錶 用字尾完成計算器功能

2021-08-22 12:07:47 字數 3711 閱讀 2542

正常的表示式         逆波蘭表示式

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...