Estructura lineal de la estructura de datos (pila)

Este artículo es una estructura lineal (pila) de la estructura de datos y es una nota integrada basada en el curso en línea.

¿Cómo evalúa la computadora las expresiones?

  • Las expresiones se componen de dos tipos de objetos:

    1. Operandos, como 2, 3, 4
    2. Símbolos de operación, como +, -, *, /
  • Los diferentes símbolos de operación tienen diferentes prioridades

Expresión de sufijo

  • Expresión infija: el operador se ubica entre los dos operandos. Por ejemplo, a + b * cd / e

  • Expresión de sufijo: el operador se ubica después de los dos operandos. Por ejemplo, abc * + de / -

[Ejemplo] 62 / 3-42 * + =?

后缀表达式求值策略: "Escanear" de izquierda a derecha, procesa los operandos y los símbolos de operación uno por uno

1. ¿Qué debo hacer si encuentro un operando? ¿Cómo "recordar" el número que actualmente no está involucrado en la operación?

2. ¿Qué debo hacer si encuentro símbolos aritméticos? ¿Cuál es el operando correspondiente?

Ilustración: debe haber un método de almacenamiento que pueda almacenar la aritmética en orden y generarla en "orden inverso" cuando sea necesario

Descripción abstracta del tipo de datos de la pila

Pila : una tabla lineal con ciertas restricciones de operación

  • Insertar y eliminar solo una pila (parte superior de la pila, parte superior)

  • Insertar datos: Push

  • Eliminar datos: Pop

  • Principio de último en entrar, primero en salir: último en entrar, primero en salir (LIFO)

类型名称: Pila

数据对象集: Una tabla lineal finita con 0 o más elementos.

操作集: Stack S <-Stack con una longitud de MaxSize, elemento de elemento de pila <-ElementType

1.Stack CreateStack (int MaxSize): genera una pila vacía, cuya longitud máxima es MaxSize;

2. int IsFull (Pila S, int MaxSize): determina si la pila S está llena;

3.void Push (Pila S, elemento ElementType): Empuje el elemento elemento en la pila

4.int IsEmpty (Pila S): determina si la pila S está vacía;

5. ElementType Pop (Stack S): eliminar y volver al elemento superior de la pila;

ps: Push y Pop se pueden intercalar alternativamente;

ejemplos:

Inserte la descripción de la imagen aquí

Implementación de almacenamiento secuencial de la pila

La estructura de almacenamiento secuencial de la pila generalmente consta de una matriz unidimensional y una variable que registra la posición del elemento superior en la pila.

#define MaxSize <储存数据元素的最大个数>
typedef struct SNode*Stack;
struct SNode{
    
    
	ElementType Data[MaxSize];
	int Top;
};

(1) Apilamiento

void Push(Stack PtrS, ElementType item)
{
    
    
	if(Ptrs->Top == MaxSize-1){
    
    
		printf("堆栈满")return}else{
    
    
		PtrS->Data[++(PtrS->Top)]=item;
		return;
	}
}

(2) Estallar

ElementType Pop(Stack Ptrs)
{
    
    
	if(PtrS->Top==-1){
    
    
		printf("堆栈空");
		return ERROR;/*ERROR是ElementType的特殊值,标志错误*/
	}else
		return(PtrS->Data[(PtrS->Top)--]);
}

Implementación de almacenamiento encadenado de la pila

La estructura de almacenamiento encadenado de la pila es en realidad una lista enlazada individualmente, llamada pila en cadena. Las operaciones de inserción y eliminación solo se pueden realizar en la parte superior de la pila de cadenas.

typedef struct SNode*Stack;
struct SNode{
    
    
	ElementType Data;
	struct SNode *Next;
};

(1) Inicialización de pila (compilar pila vacía)

(2) Determine si la pila s está vacía

Stack CreateStack()
{
    
    /*构建一个堆栈的头结点,返回指针*/
	Stack S;
	S = (Stack)malloc(sizeof(struct SNode));
	S->Next = NULL;
	return S;
}
int IsEmpty(Stack S)
{
    
    /*判断堆栈s是否为空,若为空函数返回整数1,否则返回0*/
	return (S->Next == NULL);
}
void Push(ElementType item,Stack S)
{
    
    /*将元素item压入堆栈s*/
	struct SNode *TmpCell;
	TmpCell=(struct SNode*)malloc(sizeof(struct SNode));
	TmpCell->Element = item;
	TmpCell->Next = S->Next;
	S->Next = TmpCell;
}
ElementType Pop(Stack S)
{
    
    /*删除并返回堆栈S的栈顶元素*/
	struct SNode *FirstCell;
	ElementType TopElem;
	if(IsEmpty (S)){
    
    
		printf("堆栈空")return NULL;
	}else{
    
    
		FirstCell = S->Next;
		S->Next = FirstCell->Next;
		TopElem = FirstCell->Element;
		free(FirstCell);
		return TopElem;
	}
}

Aplicación de pila

Evaluación de expresiones: lea los elementos (operadores u operandos) de la expresión de sufijo de izquierda a derecha

1. Operando: empujar hacia la pila

2. Operador: saque un número apropiado de operandos de la pila, calcule y empuje el resultado a la pila;

3. Finalmente, el elemento en la parte superior de la pila es el valor de resultado de la expresión.
Inserte la descripción de la imagen aquí

Evaluación de expresión infija

¿Cómo convertir una expresión infija en una expresión postfija?

Iluminación:

1. El orden relativo de los operandos permanece sin cambios

2. El orden de los símbolos de operación ha cambiado.

  • Necesita almacenar símbolos aritméticos "en espera" (¡pila!)
  • Para comparar el símbolo aritmético actual con el último símbolo aritmético "esperando"
    Inserte la descripción de la imagen aquí

método:

Leer cada objeto de la expresión infija de principio a fin y tratar diferentes objetos de acuerdo con diferentes situaciones.

  1. Operando: salida directa;
  2. Soporte izquierdo: empújelo en la pila;
  3. Paréntesis derecho: coloca el operador en la parte superior de la pila y dale salida hasta que encuentre el paréntesis izquierdo (sale de la pila, sin salida);
  4. Operadores:
    - Si la prioridad es mayor que el operador en la parte superior de la pila, empújelo sobre la pila;
    - Si la prioridad es menor o igual que el operador en la parte superior de la pila, coloque el operador en la parte superior de la pila. la pila y la salida; compare el nuevo operador en la parte superior de la pila, hasta que el operador UN sea mayor que la prioridad del operador en la parte superior de la pila, luego empuje al operador cambiado hacia la pila;
  5. Si se completa el procesamiento de cada objeto, los operadores almacenados en la pila se emiten juntos.

Ejemplos:
Inserte la descripción de la imagen aquí

otras aplicaciones:

  • Llamada a función e implementación recursiva
  • Búsqueda en profundidad primero
  • Algoritmo de retroceso
  • 。。。

Descargo de responsabilidad: Parte de la información proviene de Internet, si hay alguna infracción, comuníquese conmigo para eliminarla.
Si hay errores, confusiones, etc. en el artículo, ¡las críticas y correcciones son bienvenidas!

Supongo que te gusta

Origin blog.csdn.net/hxtxsdcxy/article/details/113748961
Recomendado
Clasificación