В этом вызове
x = atoi(s.top());
объект типа char
передается в качестве аргумента функции atoi, которая ожидает аргумент типа char *
. Обратите внимание, что этот стек определен как стек отдельных символов.
stack<char>s;
Вы можете написать
x = s.top() - '0';
Если вы хотите, чтобы число, сохраненное в исходной строке, помещалось на затем в стеке пишем
const int Base = 10;
int multiplier = 1;
num = 0;
while(!s.empty()){
int x=0;
//sscanf(s.top(),"%d",&x);
x = s.top() - '0';
num += multiplier * x;
multiplier *= Base;
//...
Если вы хотите получить число в обратном порядке, тогда пишите
const int Base = 10;
num = 0;
while(!s.empty()){
int x=0;
//sscanf(s.top(),"%d",&x);
x = s.top() - '0';
num = Base * num + x;
//...
Имейте в виду, что есть стандартная функция std::stoi
, которая выполняет необходимые преобразование строки в число.
И вам следует использовать объект типа unsigned int. В противном случае пользователь может ввести отрицательное число, и оно будет обработано неправильно. Вот демонстрационная программа
#include <iostream>
#include <string>
#include <stack>
int main()
{
unsigned int n;
while ( std::cin >> n && n != 0 )
{
std::string strnum = std::to_string( n );
std::stack<char> s;
for ( char c : strnum ) s.push( c );
unsigned long long int num = 0;
while ( !s.empty() )
{
unsigned int digit = s.top() - '0';
num += digit * digit;
s.pop();
}
std::cout << "num = " << num << '\n';
}
return 0;
}
Если ввести число 123
, то его вывод может выглядеть как
num = 14
, то есть 1 * 1 + 2 * 2 + 3 * 3 == м 14.