Вернуть значения из функции для stack в c++
Задача: Сделать ханойскую башню , чтобы можно было через консоль перекидывать круги . Указываешь количество кругов и тебе теперь нужно их перекидывать пока на 2 или 3 башне не будут все круги . 1- меньший круг и находится на самом верху .
Без использования функции я задачу решил и выполнил , но когда решил что можно попробовать одно и тоже действие выразить через функцию то ничего не выходит .Сама функция :
int lastabd(stack <int> str1 ,stack <int> str2,stack <int> str3,int a,int b,int c,int n){
cout<<"test";
if(str1.size()!=0)
{a = 0;
a+=str1.top();}
if(str1.size()==0){ a = n + 1;}
if(str2.size()!=0)
{b = 0;
b += str2.top();}
if(str2.size()==0){ b = n + 1;}
if(str3.size()!=0)
{c = 0;
c+=str3.top();}
if(str3.size()==0){ c = n + 1;}
return str1,str2,str3,a,b,c; }
str1,str2,str3 - сами стеки . a,b,c=верхний элемент стека . n-количества колец используемых .Когда всё сделал в цикле не используя функцию то всё работало. Возможно ошибка в обьявлении или в чём-то другом . Полный код:
#include <iostream>
#include <locale>
#include <fstream>
#include <stack>
#include <windows.h>
#include <clocale>
#include <cstdlib>
void color(int c, int b);
using namespace std;
int lastabd(stack <int> str1 ,stack <int> str2,stack <int> str3,int a,int b,int c,int n)
{
cout<<"test";
if(str1.size()!=0)
{a = 0;
a+=str1.top();}
if(str1.size()==0){ a = n + 1;}
if(str2.size()!=0)
{b = 0;
b += str2.top();}
if(str2.size()==0){ b = n + 1;}
if(str3.size()!=0)
{c = 0;
c+=str3.top();}
if(str3.size()==0){ c = n + 1;}
return str1,str2,str3,a,b,c;
}
int main()
{
setlocale(0, "");
//setlocale(LC_CTYPE,"Russian");
int s, i, n, choice,a,b,c,schet=0;
stack <int> s1;
stack <int> s11;
stack <int> s2;
stack <int> s22;
stack <int> s3;
stack <int> s33;
cout << "Введите количество колец" << endl;
cin >> n;
cout<<endl;
s = n;
for (i = n - 1; i > -1; i--)
{
s1.push(s);
//cout<<s<<" ";
s--;
}
a = s+1;
b = n + 1;
c = n + 1;
lastabd(s1,s2,s3,a,b,c,n);
while (1) {
if(s2.size()==n||s3.size()==n)
{
color(10, 4);
cout<<"ПОЗДРАВЛЯЮ! ВЫ ВЫЙГРАЛИ";
cout<<endl<<"Было совершено: "<<schet<<" действий!";
color(6, 1);
exit(0);
}
else{
s11 = s1;
s22 = s2;
s33 = s3;
//cout << endl;
//cout << "ВЫВОД 1 , 2 И 3 БАШНИ" << endl;
color(14, 1);
cout <<endl<< "Первая башня:";
while (!s11.empty())
{
cout << s11.top() << " ";
s11.pop();
}
cout << endl << "Вторая башня:";
while (!s22.empty())
{
cout << s22.top() << " ";
s22.pop();
}
cout << endl << "Третья башня:";
while (!s33.empty())
{
cout << s33.top() << " ";
s33.pop();
}
color(2, 1);
//color(4, 4);
//system("Color F8");
cout << endl <<endl<< "0 - Выход." << endl;
cout << "1 - Переместить с 1 на 2" << endl;
cout << "2 - Переместить с 1 на 3" << endl;
cout << "3 - Переместить с 2 на 3" << endl;
cout << "4 - Переместить с 2 на 1" << endl;
cout << "5 - Переместить с 3 на 1" << endl;
cout << "6 - Переместить с 3 на 2" << endl;
color(6, 1);
//color(7, 3);
cout << "A:" << a << endl;
cout << "B:" << b << endl; //Нужно было для проверки последнего числа
cout << "C:" << c << endl;
cout << "Enter your choice: ";
cin >> choice;
switch (choice) {
case 1:
{
if(a < b){
s2.push(s1.top());//с первого на 2
s1.pop();
lastabd(s1,s2,s3,a,b,c,n);
schet++;
system("cls"); //ОЧИСТКА КОНСОЛИ
continue;}
else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
system("cls"); //ОЧИСТКА КОНСОЛИ
continue;}
}
case 2:
if(a < c){
s3.push(s1.top());//с первого на 3
s1.pop();
lastabd(s1,s2,s3,a,b,c,n);
schet++;
system("cls");
continue;}
else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
system("cls");
continue;}
case 3:
if(b < c){
s3.push(s2.top());//с второго на 3
s2.pop();
lastabd(s1,s2,s3,a,b,c,n);
schet++;
system("cls");
continue;}
else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
system("cls");
continue;}
case 4:
if(b < a){
s1.push(s2.top());//с второго на 1
s2.pop();
lastabd(s1,s2,s3,a,b,c,n);
schet++;
system("cls");
continue;}
else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
system("cls");
continue;}
case 5:
if(c < a){
s1.push(s3.top());//с третьего на 1
s3.pop();
lastabd(s1,s2,s3,a,b,c,n);
schet++;
system("cls");
continue;}
else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
system("cls");
continue;}
case 6:
if(c < b){
s2.push(s3.top());//с третьего на 2
s3.pop();
lastabd(s1,s2,s3,a,b,c,n);
schet++;
system("cls");
continue;}
else{color(4, 4); cout<<endl<<"Неверный ввод"<<endl; color(6, 1);
system("cls");
continue;}
case 0:
exit(0);
default:
cout << "Неправильно.Попробуй ещё раз" << endl;
}
}
}
}
void color(int c, int b)
{
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(hConsole, (WORD)(c | b));
}
если заменить lastabd на его содержимое то всё будет работать . Работаю в codeblocks