基本思路:
首先定義兩個棧,乙個存放數字,乙個存放符號。
存放數字的棧:
只有當後面的一位是符號時才入棧,這是因為如果是乙個多位數的情況。
存放符號的棧:
1.當符號棧為空或者是a[i] 不是 『)』並且棧頂元素是『(』時或者符號優先順序大於棧頂元素的優先順序時入棧。
2.當a[i] 是 『)』並且棧頂元素是『(』時,彈出棧頂元素,即括號成對了,把左括號刪除。
3.當a[i] 是 『)』並且棧頂元素不是『(』時或者符號優先順序小於等於棧頂元素的優先順序時或者表示式結束,但是符號棧不為空時進行相應的加減乘除運算。
最後數字棧裡只有乙個元素就是最後的運算結果。
直接放**:
#include
#include
#define success 0
#define failure -1
struct node
;typedef
struct node node;
struct
stack
;typedef
struct
stack linkstack;
int stackinit(linkstack *s)
int stackpush(linkstack *s, int e)
node *p = (node *)malloc(sizeof(node));
if(p == null)
p->data = e;
p->next = s->top;
s->top = p;
s->count++;
return success;
}int stackempty(linkstack *s)
if(s->count == 0)
else
}int stackgettop(linkstack *s)
return (s->top->data);
}int stackpop(linkstack *s)
int e;
node *p = (node *)malloc(sizeof(node));
if(p == null)
p = s->top;
e = s->top->data;
s->top = s->top->next;
free(p);
s->count--;
return e;
}int priority(char c)
}int main()
; int ret, i = 0;
int temp = 0, j;
linkstack opt, num;
if(stackinit(&num) != success || stackinit(&opt) != success)
printf("please input a option:\n");
scanf("%s", a);
while(a[i] != '\0' || (stackempty(&opt) != success))
}else
if(a[i] == ')' && stackgettop(&opt) == '(')
if((a[i] == ')' && stackgettop(&opt) != '(') || (priority(a[i]) <= priority(stackgettop(&opt))) || (a[i] == '\0' && stackempty(&opt) != success))
continue;}}
}printf("the result is %d\n", stackpop(&num));
return
0;}
四則運算表示式 逆波蘭表示式
感覺是一塊比較偏門的東西,特此記錄下 或者叫字尾表示式,我們原先用的一直都是中綴表示式,但是因為如果表示式過長,計算機計算起來不方便。需要先遍歷一邊,找出其中的 進行優先計算,如果有多個 疊加的話就更麻煩了。於是為了計算機的方便計算,將中綴表示式轉換成字尾表示式,計算機便可以使用棧的特性,來快速的計...
棧的應用 四則運算(逆波蘭表示式)
int compute char s 81 sval valtop y y用來接收轉化的數字 i else if s i s i s i s i 運算子 sop optop s i else if s i else if s i optop i while optop return sval val...
逆波蘭表示式解決四則運算
逆波蘭表示式又叫做字尾表示式,它將複雜表示式轉換為可以依靠簡單的操作得到計算結果的表示式,解決了四則運算中括號改變運算子優先順序的問題。四則運算的表示式一般都是中綴表示式如 1 2 3 4 5,即操作符在兩個運算元之間。四則運算需要兩個步驟,一是把中綴表示式轉為字尾表示式,二是由字尾表達生成結果 c...