zoukankan      html  css  js  c++  java
  • Python 和 PHP 实现 队列 和 栈 以及 利用栈实现符号匹配算法

    <?php
    #数据集合,可以理解为只能在一端进行插入或者删除操作
    #后进先出
    #基本操作:1.进栈 push 2.出栈 pop 3.取栈顶 gettop
    #python3 使用一般的列表结构可实现栈 进栈:li.append 出栈:li.pop 取栈顶:li[-1]
    #php7 使用数组结构可实现栈 进栈:array_push(array,value) 出栈:array_pop(array) 取栈顶:end(array)
    class Stack{
    	private $stack = array();
    	private $stackMaxTop = 100;
    	private $Top = 0;
    
    	#栈是否空
    	public function stack_is_null()
    	{
    		if (count($this->stack) <= 0) {
    			return 0;
    		} else {
    			return 1;
    		}
    	}
    	#进栈
    	public function push($value){
    		if (empty($value)) {
    			return "栈值不能为空";
    		}
    		if ($this->stackMaxTop == $this->Top) {
    			return "栈已满";
    		}
    		array_push($this->stack,$value);
    		++$this->Top;
    		return '栈顶的值'.$this->Top;
    	}
    	#出栈
    	public function pop()
    	{
    		if (!$this->stack_is_null()) {
    			return None;
    		};
    		array_pop($this->stack);
    
    	}
    	#取栈顶
    	public function get_top()
    	{
    		if (!$this->stack_is_null()) {
    			return None;
    		};
    		return end($this->stack);
    	}
    	#返回栈内所有元素
    	public function get_stack()
    	{
    		return $this->stack;
    	}
    }
    #栈的应用--括号匹配问题 
    #解决思路 如果是左括号就进栈  如果左右匹配则直接出栈
    #()()[]{} 匹配
    #([{()}]) 匹配
    #[]{ 不匹配
    #[(](] 不匹配
    
    public function branch_match($string)
    {
    
    	if ((!$arr)) {
    		return False;
    	}
    	$left = [')'=>'(',']'=>'[','}'=>'{'];
    	$kh = ['(','[','{'];
    	//$string = '([{()}])';
    	$i = 0;
    	$stack = new Stack();
    	$arr = str_split($string);
    
    	while ($i < count($arr)) {
    		if (in_array($arr[$i], $kh)) {
    			$stack->push($arr[$i]);
    		}else{
    			$top = $stack->get_top();
    			$zf = $arr[$i];
    			if (!$stack->stack_is_null()) {
    				return False;
    			}
    			if ($left[$zf] == $top) {
    				$stack->pop();
    			}else{
    				return False;
    			}
    		}
    		//var_dump($stack->get_stack());
    		$i++;
    	}
    	if ($stack->stack_is_null()) {
    		return False;
    	}else{
    		return True;
    	}
    
    }
    
    #Python 3
    #声明Python类
    class Stack:
    	def __init__(self):
    		self.stack = []
    	def push(self,element):
    		self.stack.append(element)
    	def pop(self):
    		return self.stack.pop()
    	def get_top(self):
    		if len(self.stack) > 0:
    			return self.stack[-1]
    		else
    			return None
    	def is_empty():
    		return len(self.stack) == 0
    
    #Python实现符号匹配算法
    def brance_match(s):
    	match = {'}':'{',']':'[',')':'('}
    	stack  = Stack()
    	for ch in s:
    		if ch in {'(','[','{'}:
    			stack.push(ch)
    		else:
    			if stack.is_empty():
    				return False
    			elif stack.get_top() == match[ch]:
    				stack.pop()
    			else:
    				return False
    	if stack.is_empty():
    		return True
    	else:
    		return False
    
    #python  栈结束
    
    # 队列 先进先出
    # 仅允许在列表的一端进行插入和另一端进行删除。进行插入的一端为队尾,插入动作称为进队或入队
    # 进行 删除的一端称为对头,删除动作称为出队 
    # 环形队列:当队尾指针front == Maxsize - 1时候,在前进一个位置就自动到0
    # 队首指针前进1:front = (front+1)% Maxsize
    # 队尾指针前进1:rear = (rear+1)% Maxsize
    # 队空:rear == front
    # 队满条件:(rear+1)% Maxsize == front
    
    class Queue{
    	private $queue = array();
    	private $rear = 0;
    	private $front = 0;
    	private $size = 0;
    
    	#创建队列
    	public function create_queue($size)
    	{
    		if ($size <= 0 ) {
    			return 'NONE';
    		}
    		for ($i=0; 	$i < $size;	 $i++) 	{ 
    			$queue[$i] = $i;
    		}
    		$this->size = $size;
    	}
    	#进队
    	public function push($value)
    	{
    		if (!$this->is_filled()) {
    			$this->rear = ($this->rear+1) % $this->size;
    			$this->queue[$this->rear] = $value;
    		} else {
    			return False;
    		}
    	}
    	#出队
    	public function pop()
    	{
    		if (!$this->is_empty()) {
    			$this->front = ($this->front + 1) % $this->size;
    			return $this->queue[$this->front];
    		}else{
    			return False;
    		}
    	}
    	#d队满
    	public function is_filled()
    	{
    		return ($this->rear+1) % $this->size == $this->front;
    	}
    	#队空
    	public function is_empty()
    	{
    		return $this->rear == $this->front;
    	}
    }
    
    #Python 实现队列的类
    
    class Queue:
    	def __init__(self,size=100):
    		self.queue = [0 for _ in range(size)]
    		self.size = size
    		self.rear = 0 
    		self.front = 0
    
    	def push(self,element):
    		if not self.is_filled():
    			self.rear = (self.rear + 1) % self.size
    			self.queue[self.rear] = element
    		else:
    			raise IndexError("Queue is Filled")
    	def pop(self):
    		if not self.is_empty():
    			self.front = (self.front+1)%self.size
    			return self.queue[self.front]
    		else:
    			raise IndexError("Queue is empty")
    
    	def is_empty():
    		return self.rear == self.front
    
    	def is_filled():
    		return (self.rear + 1) % size == front
    
    #Python 队列结束
    
  • 相关阅读:
    测试
    微商就该这么加粉丝,你造吗?
    下拉刷新ListView实现原理
    android studio出现 waiting for adb
    发现一个很好的android开发笔记库
    android studio 不能在线更新android SDK Manager问题解决办法
    asp.net中XmlDocument解析出现出错,处理特殊字符
    假如是你,你会怎么选择
    winrt 上的翻书特效组件 源码分享 转载请说明
    在Windows8 Winrt中 高性能处理多个条件语句 用于实现自定义手势
  • 原文地址:https://www.cnblogs.com/ikai/p/11984257.html
Copyright © 2011-2022 走看看