To tak naprawdę jest trochę nietypowy stos który w wyniku operacji zwraca wynik albo ":(" albo ":)" albo wartość przetworzoną na string.
Znaki '+' i '-', to komendy do wykonania gdzie komenda '+', wymaga następnego argumentu a '-' tego argumentu nie posiada.
Stąd warto stworzyć klasę stosu, która posiada metody pop() i push(int value) które wykonują te operacje.
#include <iostream>
#include <string>
struct Stack {
constexpr static unsigned max_stack_size = 10;
Stack()
: values{}, size{} {}
std::string push(int value) {
return size < max_stack_size ? values[size++] = value, ":)": ":(";
}
std::string pop() {
return size ? std::to_string(values[--size]): ":(";
}
private:
int values[max_stack_size];
unsigned size;
};
static Stack stack;
int main() {
Stack stack;
char command;
int value;
while(std::cin >> command) {
std::cout << (command == '+' ? std::cin >> value, stack.push(value): stack.pop()) << '\n';
}
}
Jeśli jednak (co robisz), chcesz "rozebrać" klasę stosu na "elementy pierwsze", to bazując na Twoim kodzie i zakładając że stosujesz C++98 (a nie jak poprzednio w kodzie podanym C++11):
#include <iostream>
static const unsigned int maksymalna_wielkosc_stosu = 10;
using namespace std;
int main()
{
int stos[maksymalna_wielkosc_stosu];
char komenda;
unsigned int wielkosc_stosu = 0;
int wartosc;
while(cin >> komenda){
if (komenda == '+'){
cin >> wartosc;
if(wielkosc_stosu < maksymalna_wielkosc_stosu) {
stos[wielkosc_stosu++] = wartosc;
cout << ":)";
} else {
cout << ":(";
}
} else if((komenda == '-') && (wielkosc_stosu != 0)) {
cout << stos[--wielkosc_stosu];
} else {
cout << ":(";
}
cout << '\n';
}
}
Co wygląda mało czytelnie (IMHO).
BTW warto stosować nazwy które coś znaczą bo kod wtedy jest czytelny.
Reorganizując nieco kod, można tak:
#include <iostream>
static const unsigned int maksymalna_wielkosc_stosu = 10;
using namespace std;
int stos[maksymalna_wielkosc_stosu];
static unsigned int wielkosc_stosu;
void push_stack() {
int wartosc;
cin >> wartosc;
if(wielkosc_stosu < maksymalna_wielkosc_stosu) {
stos[wielkosc_stosu++] = wartosc;
cout << ":)";
} else {
cout << ":(";
}
}
void pop_stack() {
if(wielkosc_stosu != 0) {
cout << stos[--wielkosc_stosu];
} else {
cout << ":(";
}
}
int main()
{
char komenda;
while(cin >> komenda){
switch(komenda) {
case '+':
push_stack();
break;
case '-':
pop_stack();
break;
}
std::cout << '\n';
}
}
A podchodząc bardziej funkcyjnie (ale bez ortodoksji), możesz mieć kod taki:
#include <iostream>
#include <iterator>
#include <string>
#include <algorithm>
using namespace std;
constexpr static unsigned int max_stack_size = 10;
int stack[max_stack_size];
static unsigned int stack_size;
std::string push_stack() {
int value;
cin >> value;
return (stack_size < max_stack_size ? stack[stack_size++] = value, ":)": ":(");
}
std::string pop_stack() {
return (stack_size ? std::to_string(stack[--stack_size]): ":(");
}
int main()
{
transform(istream_iterator<char>(cin), istream_iterator<char>(), ostream_iterator<string>(cout, "\n"),
[](char c) {
return (c == '+' ? push_stack(): pop_stack());
});
}