Red de conocimiento informático - Conocimiento del nombre de dominio - ¡Urgente! Operaciones de pila, pop en C++

¡Urgente! Operaciones de pila, pop en C++

El tipo de valor de retorno emergente es nulo (error C2440: '=': no ​​se puede convertir de 'void' a 'char' deja esto claro). Porque si devuelve un tipo no vacío, se llamará al constructor de copia al regresar. Si arroja una excepción, se interrumpirá sin completar la construcción y no puede simplemente revertirse, por lo que la seguridad de excepción del contenedor no puede ser. garantizado. Por lo tanto, al diseñar std::stack, debe considerar dejar la función de regresar a la parte superior de la pila a otras funciones miembro. El prototipo de esta función miembro es const typename std::stack::value_type&std::stack. ::top() const;, abreviado como const value_type top() const; en el ámbito de clase de std::stack, donde value _type es el tipo de elemento.

Por lo tanto, s2[len]=st.pop(); Deberías usar

s2[len]=st.top();

st.pop();

Además, dado que estás usando string , entonces no hay problema con la comparación directa entre == y !

El prototipo de strcmp es int strcmp(const char*, const char*);, que no acepta parámetros de tipo cadena, por lo que se producirá un error.

O utilice la función miembro de cadena c_str para obtener una representación de cadena estilo C: strcmp(s1.c_str(),s2.c_str()). También puedes usar una matriz de caracteres en lugar de una cadena, por lo que puedes usar strcmp directamente.

↑2011-3-20 20:36.

----

er... Acabo de notar que LZ usa cadena en lugar de operador[ ]... Tenga en cuenta que las cadenas son las mismas que las matrices integradas, vectores, mapas, etc., el operador [] no realizará comprobaciones fuera de límites (excepto las matrices integradas, todas las matrices anteriores tienen miembros funciones que completan la misma función, y verificará antes de verificar si está fuera de los límites. Si está fuera de los límites, se lanzará una excepción out_of_range) ..., y la memoria administrada por la propia cadena se ha determinado después de LZ. inicialización (porque ninguna llamada cambiará el tamaño de la memoria), aunque normalmente es de 16 bytes, pero no está garantizado (depende de la clase de plantilla std::basic_string). Implementación de Basic_string; aquí LZ se olvidó de len++ y la puesta a cero de cola. (Todavía tengo problemas después de corregir aquí, así que esta debería ser la razón). Para cadenas, es mejor usar += para agregar contenido al final. Si no hay suficiente memoria, el sistema asignará memoria automáticamente, lo cual es más intuitivo.

Si debes usar [], es mejor usar una matriz o un puntero para asignar el espacio tú mismo.

Código modificado (ver segundo bucle while):

#include

#include

#include < pila>

usando el espacio de nombres std;

int main()

{

int len=0;

string s1;

string s2;

stack st;

cout<< "Ingrese el carácter a juzgar String: ";

cin>>s1;

mientras(s1[len]! = '\0')

{

st.push (s1[len]);

len++;

}

len=0;

while(st. size()! = 0)

{

s2+=st.top();

st.pop();

}

if(s1==s2)

cout<< "Esta cadena es un palíndromo"

return 0;

}