資料結構——實現多項表示式結果計算
阿新 • • 發佈:2018-12-18
1、程式檔案
I、
在多項表示式/stack目錄下分別建立main.c、Stack.c檔案
// main.c #include <stdio.h> #include <string.h> #include "stack.h" // 判斷操作符是否入棧、進行優先順序的比較、 // 可以入棧時,返回TRUE BOOL jud(Stack *s, int ope) { // 空棧判斷 if(Empty(s)) { return TRUE; } int top = GetTop(s); switch(top) { // 如果棧頂操作符是加減 case '+': case '-': // * / ( 需要入棧 if ('*' == ope || '/' == ope || '(' == ope) return TRUE; break; case '*': case '/': // ( 需要入棧 if('(' == ope ) return TRUE; break; case '(': if (')' == ope) { Pop(s); } return TRUE; default: break; } return FALSE; } // 計算 void calc(Stack *s_opes, Stack *s_nums) { int num1 = GetTop(s_nums); Pop(s_nums); int num2 = GetTop(s_nums); Pop(s_nums); int ope = GetTop(s_opes); Pop(s_opes); int res; switch(ope) { case '+': res = num1 + num2; break; case '-': res = num2 - num1; break; case '*': res = num1 * num2; break; case '/': res = num2 / num1; break; default: break; } Push(s_nums, res); // 結果入棧 } // 操作符處理函式 // deal_ope(&s_opes, &s_nums, *p); 將操作符傳遞過來 void deal_ope(Stack *s_opes, Stack *s_nums, char ope) { // 判斷入棧還是不入棧,傳遞操作符棧、及現有操作符 // 進行優先順序的比較 if (jud(s_opes, ope) == TRUE) { Push(s_opes, ope); } // 不入棧,需要計算,可能涉及多個符號的運算 else { while (jud(s_opes, ope) == FALSE) { calc(s_opes, s_nums); } // 符號需要入棧 // 如果是)則不需要把其壓入棧 if (')' != ope) { Push(s_opes, ope); } } } int main() { //存放表示式 char buf[100]; fgets(buf, 100, stdin); buf[strlen(buf)-1] = '\0'; // 運算元棧 Stack s_nums; // 操作符棧 Stack s_opes; //順序棧 Init(&s_nums); Init(&s_opes); char *p = buf; while (*p) { // 處理運算元 if (*p >= '0' && *p <= '9') { int num = 0; while (*p >= '0' && *p <= '9') { num = num*10 + *p - '0'; p++; } // 運算元入棧 Push(&s_nums, num); continue; } // 處理操作符 deal_ope(&s_opes, &s_nums, *p); p++; } // 計算剩餘的數 while (!Empty(&s_opes)) { calc(&s_opes, &s_nums); } int res = GetTop(&s_nums); printf ("結果:%d\n", res); return 0; }
// Stack.c #include <stdio.h> #include <stdlib.h> #include "stack.h" void Init(Stack *s) { if (NULL == s) return; s->top = NULL; } BOOL Empty(Stack *s) { if (NULL == s) return FALSE; if (NULL == s->top) return TRUE; return FALSE; } void Push(Stack *s, Data data) { if (NULL == s) return; Node *node = (Node *)malloc(sizeof(Node)/sizeof(char)); if (NULL == node) return; node->data = data; node->next = s->top; s->top = node; } void Pop(Stack *s) { if (NULL == s) return; if (Empty(s) == TRUE) return; Node *tmp = s->top; s->top = tmp->next; free(tmp); } Data GetTop(Stack *s) { if (NULL == s) return; if (Empty(s) == TRUE) { printf ("無棧頂元素\n"); exit(-1); // 程式退出 } return s->top->data; }
II、
在順序佇列/include目錄下建立Stack.h檔案
#ifndef _STACK_H_ #define _STACK_H_ #define SIZE 10 typedef enum {FALSE, TRUE} BOOL; typedef int Data; typedef struct node { Data data; struct node *next; }Node; typedef struct stack { Node *top; }Stack; // 初始化棧 void Init(Stack *s); // 判斷空棧 BOOL Empty(Stack *s); // 入棧 void Push(Stack *s, Data data); // 出棧 void Pop(Stack *s); // 獲取棧頂元素 Data GetTop(Stack *s); #endif // _STACK_H_
2、測試結果
[email protected]:/多項表示式# make
gcc -c src/main.c -I ./include -o obj/main.o -g
gcc obj/main.o obj/Stack.o -o bin/a.out
[email protected]:/多項表示式# ./bin/a.out
(1+2)*4-5
結果:7