You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++静态队列程序报错:invalid types 'int[int]' for array subscript 问题排查求助

解决invalid types 'int[int]' for array subscript错误及循环队列代码问题

嘿,我来帮你排查这个错误和代码里的其他问题。首先说你遇到的核心错误:

错误原因:变量名冲突

在你的Cola::queve方法里,参数名datos和类的私有成员数组datos重名了!这就导致编译器把datos[final]里的datos解析成了传入的int类型参数(因为TIPO_DATO定义的是int),而不是你想访问的数组。用一个int变量作为数组下标,自然会报invalid types 'int[int]' for array subscript这个错误。

接下来我们一步步修正代码,顺便解决队列逻辑里的其他问题:

1. 修复变量名冲突

把queve方法的参数名改成和成员数组不冲突的名字,比如nuevoDato:

void Cola::queve(TIPO_DATO nuevoDato){
    // 后续用nuevoDato代替原来的datos参数
}

2. 修正队列空/满的判断逻辑

你的循环队列当前的空、满判断逻辑是错的,而且vacia()里return之后的cout语句永远不会执行,这是个低级错误:

修正vacia()方法

循环队列的空判断应该是(final + 1) % TAM == frente(初始化状态也符合这个条件),并且把输出语句放在return之前:

bool Cola::vacia(){
    if((final + 1) % TAM == frente){
        cout<<"La cola se encuentra vacia"<<endl;
        system("PAUSE");
        menu();
        return true;
    }else{
        cout<<"La cola no esta vacia"<<endl;
        system("PAUSE");
        menu();
        return false;
    }
}

实现llena()方法

循环队列要留一个空位置来区分空和满,所以满的判断是(final + 2) % TAM == frente:

bool Cola::llena(){
    return (final + 2) % TAM == frente;
}

3. 修正queve的核心逻辑

你现在的queve里判断“如果队列空就添加元素”,这完全搞反了!应该是队列未满时才能入队,否则提示队列已满:

void Cola::queve(TIPO_DATO nuevoDato){
    if(!llena()){
        final = (final + 1) % TAM;
        datos[final] = nuevoDato;
        cout<<"元素已成功入队"<<endl;
    }else{
        cout<<"No hay espacios en la cola"<<endl;
    }
    system("PAUSE");
    menu();
}

4. 修复其他未实现/逻辑错误的方法

实现deque()方法

void Cola::deque(){
    if(!vacia()){
        frente = (frente + 1) % TAM;
        cout<<"元素已成功出队"<<endl;
    }else{
        cout<<"Error: La cola esta vacia, no se puede desencolar"<<endl;
    }
    system("PAUSE");
    menu();
}

修正front()方法

空队列时不要直接返回,要处理错误情况:

TIPO_DATO Cola::front(){
    if((final + 1) % TAM != frente){
        return datos[frente];
    } else{
        cout<<"Error: La cola esta vacia"<<endl;
        return -1; // 返回一个默认值,你可以根据需求调整
    }
}

实现imprimir()方法

void Cola::imprimir(){
    if((final + 1) % TAM == frente){
        cout<<"La cola esta vacia"<<endl;
        system("PAUSE");
        menu();
        return;
    }
    cout<<"Elementos de la cola: ";
    int i = frente;
    while(i != (final + 1) % TAM){
        cout<<datos[i]<<" ";
        i = (i + 1) % TAM;
    }
    cout<<endl;
    system("PAUSE");
    menu();
}

5. 完善菜单逻辑

菜单里的很多case没有实现功能,比如入队需要让用户输入元素,判断队列满需要调用llena():

void menu(){
    int opc;
    int a;
    cout<<"\t \t ***** MENU PRINCIPAL *****"<<endl;
    cout<<"Selecciona la opcion deseada"<<endl;
    cout<<"1. Verificar si la cola esta vacia"<<endl;
    cout<<"2. Verificar si la cola esta llena"<<endl;
    cout<<"3. Ver el elemento del frente"<<endl;
    cout<<"4. Encolar un elemento"<<endl;
    cout<<"5. Desencolar un elemento"<<endl;
    cout<<"6. Imprimir todos los elementos"<<endl;
    cout<<"7. Anular la cola"<<endl;
    cout<<"8. Salir"<<endl;
    cin>>opc;
    cout<<endl;
    switch(opc){
        case 1:
            cola1.vacia();
            break;
        case 2:
            if(cola1.llena()){
                cout<<"La cola se encuentra llena"<<endl;
            }else{
                cout<<"La cola no esta llena"<<endl;
            }
            system("PAUSE");
            menu();
            break;
        case 3: {
            TIPO_DATO valor = cola1.front();
            if(valor != -1){
                cout<<"El elemento del frente es: "<<valor<<endl;
            }
            system("PAUSE");
            menu();
            break;
        }
        case 4:
            cout<<"Ingrese el valor a encolar: ";
            cin>>a;
            cola1.queve(a);
            break;
        case 5:
            cola1.deque();
            break;
        case 6:
            cola1.imprimir();
            break;
        case 7:
            cola1.anular();
            cout<<"Cola anulada correctamente"<<endl;
            system("PAUSE");
            menu();
            break;
        case 8:
            exit(0);
            break;
        default:
            cout<<"Opcion invalida, intente nuevamente"<<endl;
            system("PAUSE");
            menu();
            break;
    }
}

修正后的完整代码

#include <iostream>
#include <stdlib.h>
using namespace std;
#define TAM 10
#define TIPO_DATO int
void menu();
class Cola{
private:
    TIPO_DATO datos[TAM];
    int frente;
    int final;
public:
    void inicializa();
    bool vacia();
    bool llena();
    TIPO_DATO front();
    void queve(TIPO_DATO nuevoDato);
    void deque();
    void imprimir();
    void anular();
};
int main(){
    menu();
    return 0;
}
Cola cola1;
void menu(){
    int opc;
    int a;
    cout<<"\t \t ***** MENU PRINCIPAL *****"<<endl;
    cout<<"Selecciona la opcion deseada"<<endl;
    cout<<"1. Verificar si la cola esta vacia"<<endl;
    cout<<"2. Verificar si la cola esta llena"<<endl;
    cout<<"3. Ver el elemento del frente"<<endl;
    cout<<"4. Encolar un elemento"<<endl;
    cout<<"5. Desencolar un elemento"<<endl;
    cout<<"6. Imprimir todos los elementos"<<endl;
    cout<<"7. Anular la cola"<<endl;
    cout<<"8. Salir"<<endl;
    cin>>opc;
    cout<<endl;
    switch(opc){
        case 1:
            cola1.vacia();
            break;
        case 2:
            if(cola1.llena()){
                cout<<"La cola se encuentra llena"<<endl;
            }else{
                cout<<"La cola no esta llena"<<endl;
            }
            system("PAUSE");
            menu();
            break;
        case 3: {
            TIPO_DATO valor = cola1.front();
            if(valor != -1){
                cout<<"El elemento del frente es: "<<valor<<endl;
            }
            system("PAUSE");
            menu();
            break;
        }
        case 4:
            cout<<"Ingrese el valor a encolar: ";
            cin>>a;
            cola1.queve(a);
            break;
        case 5:
            cola1.deque();
            break;
        case 6:
            cola1.imprimir();
            break;
        case 7:
            cola1.anular();
            cout<<"Cola anulada correctamente"<<endl;
            system("PAUSE");
            menu();
            break;
        case 8:
            exit(0);
            break;
        default:
            cout<<"Opcion invalida, intente nuevamente"<<endl;
            system("PAUSE");
            menu();
            break;
    }
}
//Prototipos de la cola
void Cola::inicializa(){
    frente = 0;
    final = TAM-1;
}
bool Cola::vacia(){
    if((final + 1) % TAM == frente){
        cout<<"La cola se encuentra vacia"<<endl;
        system("PAUSE");
        menu();
        return true;
    }else{
        cout<<"La cola no esta vacia"<<endl;
        system("PAUSE");
        menu();
        return false;
    }
}
bool Cola::llena(){
    return (final + 2) % TAM == frente;
}
void Cola::queve(TIPO_DATO nuevoDato){
    if(!llena()){
        final = (final + 1) % TAM;
        datos[final] = nuevoDato;
        cout<<"元素已成功入队"<<endl;
    }else{
        cout<<"No hay espacios en la cola"<<endl;
    }
    system("PAUSE");
    menu();
}
void Cola::deque(){
    if(!vacia()){
        frente = (frente + 1) % TAM;
        cout<<"元素已成功出队"<<endl;
    }else{
        cout<<"Error: La cola esta vacia, no se puede desencolar"<<endl;
    }
    system("PAUSE");
    menu();
}
TIPO_DATO Cola::front(){
    if((final + 1) % TAM != frente){
        return datos[frente];
    } else{
        cout<<"Error: La cola esta vacia"<<endl;
        return -1;
    }
}
void Cola::imprimir(){
    if((final + 1) % TAM == frente){
        cout<<"La cola esta vacia"<<endl;
        system("PAUSE");
        menu();
        return;
    }
    cout<<"Elementos de la cola: ";
    int i = frente;
    while(i != (final + 1) % TAM){
        cout<<datos[i]<<" ";
        i = (i + 1) % TAM;
    }
    cout<<endl;
    system("PAUSE");
    menu();
}
void Cola::anular(){
    frente = 0;
    final = TAM-1;
}

现在你的代码应该能正常运行,核心错误也解决了。

内容的提问来源于stack exchange,提问作者Luis 24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.27 16:33:13