1.表达式的计算
主要考察栈的一些运用
先加减,后乘除,有括号先算,无需多讲;
------------------------------------------------------------------------------------------------------
遇到数字入(收集数据)push_data,
(与运算符先比较优先级高入栈,低的话出栈运算并把数据入栈--
直到遇到比他高一级的运算符或者elem已空)最后push_elem,;;;
遇到‘(’入elem; ')'那就将括号里面的运算
把剩下的做运算结果存入整型数组的第一个
-----------------------------------------------------------------------------------------------------
#include <cstdio>
#include <cstdlib>
//#define _OJ_
//#define maxsize 100
typedef struct stack1
{
char *elem;
int *data;
int top; int top1;
int base; int base1;
} stack1, *stack;
stack
creat_stack(void)
{
stack s;
s = (stack) malloc (sizeof(stack1));
s->elem = (char*) malloc (100 * sizeof(char));
s->data = (int*) malloc (100 * sizeof(int));
s->top = s->base = 0;
s->top1 = s->base1 = 0;
return s;
}
int
data_pop(stack s)
{
return s->data[--s->top];
}
char
elem_pop(stack s)
{
return s->elem[--s->top1];
}
void
push_data(stack s, int x)
{
s->data[s->top++] = x;
}
void
push_elem(stack s, char ch)
{
s->elem[s->top1++] = ch;
}
int
data_isempty(stack s)
{
if(s->top == s->base)
return 1;
else
return 0;
}
int
elem_isempty(stack s)
{
if(s->top1 == s->base1)
return 1;
else
return 0;
}
char
gettop(stack s)
{
return s->elem[s->top1 - 1];
}
int
gettop1(stack s)
{
return s->data[s->top - 1];
}
int
operater(int a, char op, int b)
{
switch (op) {
case '+': return a + b;
case '-': return a - b;
case '*': return a * b;
case '/': return a / b;
}
}
int
get_rank(char op)
{
switch (op) {
case '+':
case '-': return 1;
case '*':
case '/': return 2;
case '(': return 3;
}
}
//建立一个字符数组和整型数组分别记录
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
char ch1;
int data2, data1, data, rank1, rank2, n ,i = 0;
char str[100];
stack s;
while(scanf("%s", str) != EOF){
i = 0;
s = creat_stack();
if(str[0] == '0' && str[1] == ' ') break;//遇到零就结束
if(str[0] != '0' && str[1] == ' ') {printf("%d
", str[0]); continue;}
//只有你一个数那么就输出
while (str[i] != ' ') {
data = 0;
if ('0' <= str[i] && str[i] <= '9') {
while('0' <= str[i] && str[i] <= '9') {
data = data * 10 + str[i] - '0';
i++;
}
push_data(s,data);//收集数据传入整型数组
continue;
}
else if(str[i] == '(')
push_elem(s,str[i]);
else if(str[i] == ')') {//遇右括号就把里面的数计算入栈
while (gettop(s) != '(') {
data1 = data_pop(s); data2 = data_pop(s);
ch1 = elem_pop(s);
n = operater(data2,ch1,data1);
push_data(s,n);
}
elem_pop(s);
}
else{
if(elem_isempty(s)) push_elem(s,str[i]);//先判断栈是否为空空的就入栈
else {
ch1 = gettop(s); rank1 = get_rank(ch1);
rank2 = get_rank(str[i]);
while ((ch1 != '(') && (rank2 <= rank1) && elem_isempty(s) != 1) {
ch1 = gettop(s);
if(ch1 == '(') break;//注意不可和(作比较
data1 = data_pop(s); data2 = data_pop(s);
ch1 = elem_pop(s);
n = operater(data2,ch1,data1);
push_data(s,n);
}//把优先级别高的和相等的计算入栈
push_elem(s,str[i]);
}
}
i++;
}
//把剩下的做运算结果存入整型数组的第一个
while (!elem_isempty(s)) {
//printf("good!!");
data1 = data_pop(s); data2 = data_pop(s);
ch1 = elem_pop(s);
n = operater(data2,ch1,data1);
push_data(s,n);
}
printf("%d
", gettop1(s));
}
return 0;
}