class stack {
char* stk;
unsigned int maxSize;
int top;
public:
stack() {
std::cout << "Enter the max size of stack: ";
std::cin >> maxSize;
top = 0;
stk = new char[maxSize];
}
stack(int x) {
maxSize = x;
top = 0;
stk = new char[maxSize];
}
bool isEmpty() {
return(top == 0);
}
bool isFull() {
return(top == maxSize);
}
void push(char x) {
if (!isFull()) {
stk[top++] = x;
}
else {
std::cout << "Error: Stack overflow.\n";
}
}
char pop() {
if (!isEmpty()) {
return stk[top--];
}
else {
std::cout << "Error: Stack underflow.\n";
return 0;
}
}
char peek() {
if (!isEmpty()) {
char x = stk[top];
return x;
}
else {
std::cout << "Error: Stack underflow.\n";
return 0;
}
}
};
bool isOperand(char ch)
{
if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z')
{
return 1;
}
else
{
return 0;
}
}
std::string postFixConverter(std::string str) {
int size = str.length();
stack s(size);
std::string post = "";
for (int i = 0; i < size; i++)
{
if (isOperand(str[i])) {
post += str[i];
}
else {
switch (str[i])
{
case '(':
s.push('(');
break;
case '^':
s.push('^');
break;
case '+':
s.push('+');
break;
case '-':
s.push('-');
break;
case '*':
s.push('*');
break;
case '/':
s.push('/');
break;
case ')':
while (s.peek() != '(') {
post += s.peek();
s.pop();
}
break;
default:
break;
}
}
}
do {
post += s.pop();
} while (s.isEmpty());
return post;
}
Я пытаюсь закодировать функцию c ++, которая преобразует инфиксное выражение в постфикс. Я определил свой собственный стек и не использовал стек STL. Вершина стека инициализируется с top = 0 вместо top = -1. Проблема, кажется, где-то в случае переключателя ')', который содержит цикл, который используется для извлечения до тех пор, пока не будет найден символ '(', но стек всегда кажется переполненным. Я пытался решить эту проблему, но безуспешно.