1. 程式人生 > >用棧實現簡單的四則運算

用棧實現簡單的四則運算

#include<stdio.h>
#include<stdlib.h>

#define OK 10000
#define ERROR 10001

struct node
{
	int data;
	struct node *next;
};
typedef struct node Node;

struct stack
{
	Node *top;
	int count;
};
typedef struct stack Stack;
 
int InitStack(Stack *S)
{
	S->top = NULL;
	S->count = 0;

    return OK;
}

int EmptyStack(Stack *S)
{
	return (S->count == 0) ? OK : ERROR;
}

int Push(Stack *S,int e)
{
    Node *p = (Node *)malloc(sizeof(Node));
    if(NULL == p)
    {
        return ERROR;
    }
    p->data = e;
    p->next = S->top;
    S->top = p;
    S->count++;
    
    return OK;
}

int GetTop(Stack *S)
{
    if(NULL == S->top)
    {
        return ERROR;
    }

    return (S->top->data);
}

int Priority(char s)
{
	switch(s)
	{
		case'(':
			return 3;
		case'*':
		case'/':
			return 2;
		case'+':
		case'-':
			return 1;
		default:
			return 0;
	}
}

int Pop(Stack *S)
{
	int e;
	
	if(NULL == S->top)
	{
        return ERROR;
    }

    Node *p = S->top;
    e = p->data;
    S->top = p->next;
    free(p);
    S->count--;

	return e;
}

int main()
{
	Stack num, opt;
	char str[100] ={0};
	int i = 0,tmp = 0,j;

	if (InitStack(&num) !=OK || InitStack(&opt) !=OK)
	{
		printf("Init Failure!\n");
		exit(1);
	}

	printf("Please Input Operator:\n");
	scanf("%s",str);

	while(str[i] !='\0' || EmptyStack(&opt) !=OK)
	{
		if (str[i] >= '0' && str[i] <='9')
		{
			tmp = tmp * 10 + str[i] - '0';
			i++;
			if (str[i] < '0' || str[i] >'9')
			{
				Push(&num,tmp);
				tmp = 0;
			}
		}
		else
		{
			if ((EmptyStack(&opt) ==OK) || (GetTop(&opt)=='(' && str[i] !=')')|| //進棧不運算
					(Priority(str[i])>Priority(GetTop(&opt))))
			{
				Push(&opt,str[i]);
				i++;
				continue;
			}

			if (GetTop(&opt)=='(' && str[i] ==')')  //出棧不運算
			{
				Pop(&opt);
				i++;
				continue;
			}

			if ((str[i]=='\0' && EmptyStack(&opt) !=OK) || (str[i]==')' && GetTop(&opt) !='(')||  //出棧運算
					(Priority(str[i])<=Priority(GetTop(&opt))))
			{
				switch(Pop(&opt))
				{
					case '+':
						Push(&num,Pop(&num)+Pop(&num));
						break;
					case '-':
						j = Pop(&num);
						Push(&num,Pop(&num)-j);
						break;
					case '*':
						Push(&num,Pop(&num)*Pop(&num));
						break;
					case '/':
						j = Pop(&num);
						Push(&num,Pop(&num)/j);
						break;
				}
				continue;			}
		}
	}

	printf("The result is :%d\n",Pop(&num));
	return 0;
}

優先順序高於棧頂才能進棧

遇到右括號,棧頂出來,左右括號消失

優先順序小於等於棧頂,棧頂出棧