PHP栈的定义、入栈出栈方法及基于堆栈实现的计算器完整实例

PHP栈的定义、入栈出栈方法及基于堆栈实现的计算器完整实例

1. PHP栈的定义

栈是一种数据结构,它遵循“先进后出”(Last In First Out,LIFO)的原则。在PHP中,栈可以通过数组来实现。在栈中,我们只能在栈顶进行插入和删除操作,这样就保证了最后插入的元素最先被删除。

下面是PHP中栈的定义和初始化:

class Stack {

private $stack; // 用数组表示栈

public function __construct() {

$this->stack = array();

}

}

2. 入栈出栈方法

2.1 入栈方法

入栈操作是将元素插入到栈顶的操作。在PHP中,可以使用array_push()函数来实现入栈操作。

public function push($element) {

array_push($this->stack, $element);

}

2.2 出栈方法

出栈操作是将栈顶元素删除并返回的操作。在PHP中,可以使用array_pop()函数来实现出栈操作。

public function pop() {

if ($this->isEmpty()) {

return null;

}

return array_pop($this->stack);

}

3. 基于堆栈实现的计算器完整实例

现在我们来看一个基于堆栈实现的计算器的完整例子。计算器可以进行简单的四则运算,并且支持括号的使用。

首先,我们需要定义一个函数来将中缀表达式转换为后缀表达式。中缀表达式是我们通常使用的形式,例如:2 + 3 * 4。后缀表达式是一种更容易计算的形式,例如:2 3 4 * +。

function infixToPostfix($expression) {

$operators = array('*', '/', '+', '-');

$stack = new Stack();

$output = array();

$tokens = explode(' ', $expression);

foreach ($tokens as $token) {

if (is_numeric($token)) {

$output[] = $token;

} elseif (in_array($token, $operators)) {

while (!$stack->isEmpty() && in_array($stack->peek(), $operators) && precedence($token, $stack->peek())) {

$output[] = $stack->pop();

}

$stack->push($token);

} elseif ($token == '(') {

$stack->push($token);

} elseif ($token == ')') {

while (!$stack->isEmpty() && $stack->peek() != '(') {

$output[] = $stack->pop();

}

$stack->pop();

}

}

while (!$stack->isEmpty()) {

$output[] = $stack->pop();

}

return implode(' ', $output);

}

在上面的代码中,我们使用了一个运算符优先级函数来判断运算符的优先级,较高优先级的运算符先出栈。

接下来,我们需要定义一个函数来计算后缀表达式。我们创建一个空的栈,遍历后缀表达式中的每个符号,如果是操作数,则入栈;如果是运算符,则从栈中取两个操作数进行计算,再将结果入栈。

function calculate($expression) {

$stack = new Stack();

$tokens = explode(' ', $expression);

foreach ($tokens as $token) {

if (is_numeric($token)) {

$stack->push((int)$token);

} else {

$operand2 = $stack->pop();

$operand1 = $stack->pop();

switch ($token) {

case '+':

$result = $operand1 + $operand2;

break;

case '-':

$result = $operand1 - $operand2;

break;

case '*':

$result = $operand1 * $operand2;

break;

case '/':

$result = $operand1 / $operand2;

break;

}

$stack->push($result);

}

}

return $stack->pop();

}

最后,我们可以通过调用上述函数来计算表达式的值。

$expression = "2 + 3 * 4";

$postfix = infixToPostfix($expression);

$result = calculate($postfix);

echo "The result of $expression is $result";

在上面的例子中,我们将中缀表达式转换为后缀表达式,并计算出结果。最终输出结果为:The result of 2 + 3 * 4 is 14。

总结

本文介绍了PHP栈的定义、入栈和出栈方法,并提供了一个基于堆栈实现的计算器的完整实例。栈是一种非常常用的数据结构,特别适用于需要“先进后出”操作的场景,如逆序输出、括号匹配等。使用PHP的数组可以很方便地实现栈的功能,通过封装相应的方法,可以更加方便地操作栈。

后端开发标签