#include "stdafx.h"
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#define MAX 50 //максимальная глубина стека
typedef struct stack
{
int data[MAX];
int top;
}stack;
int prior(char x) //определяет приоритет текущей операции
{
if (x == '(')
return(0);
if (x == '+' || x == '-')
return(1);
if (x == '*' || x == '/' || x == '%')
return(2);
return(3);
}
void init(stack *s)
{
s->top = -1;
}
int empty(stack *s) //проверка непустоты стека
{
if (s->top == -1)
return(1);
return(0);
}
int full(stack *s) //проверка полноты стека
{
if (s->top == MAX - 1)
return(1);
return(0);
}
void push(stack *s, int x) //добавляет элемент в стек
{
s->top = s->top + 1;
s->data[s->top] = x;
}
int pop(stack *s)
{
int x;
x = s->data[s->top];
s->top = s->top - 1;
return(x);
}
int top(stack *p) //значение верхнего элемента стека
{
return (p->data[p->top]);
}
void main()
{
char infix[30], postfix[30];
printf("Enter an infix expression: \n");
scanf("%s", &infix); //считываем всю входную строку
stack s;
char x, token;
int i, j; //i - номер символа в инфиксе, j - номер символа в постфиксе
init(&s); //инициализируем указатель на стек
j = 0;
for (i = 0; infix[i] != '\0'; i++) //бежим по строке, пока она не кончится
{
token = infix[i];
//isalnum возвращает ненулевое значение, если его аргумент является либо буквой алфавита (верхнего или нижнего регистра), либо цифрой.
//Если символ не является буквенно-цифровым, возвращается 0.
if (isalnum(token))
postfix[j++] = token;
else
if (token == '(')
push(&s, '(');
else
if (token == ')') //если ')', печатаем все до '('
while ((x = pop(&s)) != '(')
postfix[j++] = x;
else
{
while (prior(token) <= prior(top(&s)) && !empty(&s)) //пока приоритет текущего символа не превышает приоритета верхнего элемента стека
{
x = pop(&s);
postfix[j++] = x;
}
push(&s, token);
}
}
while (!empty(&s)) //печатаем все оставшиеся в стеке элементы
{
x = pop(&s);
postfix[j++] = x;
}
postfix[j] = '\0';
printf("\nPostfix expression: %s", postfix);
getch();
}
Be the first to comment
You can use [html][/html], [css][/css], [php][/php] and more to embed the code. Urls are automatically hyperlinked. Line breaks and paragraphs are automatically generated.