如何在一个数组中实现两个栈?

博客探讨如何在一个数组A[1…n]中实现两个栈,确保两栈元素个数之和不为n时都不会上溢,且push和pop操作运行时间为O(1)。实现方法是让两个栈分别从数组两端开始,向中间push元素,直至两指针相遇。

如何在一个数组A[1…n]中实现两个栈,使得当两个栈的元素个数之和不为n时,两者都不会发生上溢。

  • 要求push和pop操作的运行时间为O(1)。
实现:
  • 两个栈分别从数组的两端开始,向中间push元素,直到两个指针相遇。
package main

import "fmt"

const maxSize = 10
const (
	sLeft stackType = iota
	sRight
)

type stackType int

type Stack struct {
	arr   [maxSize]int
	left  int
	right int
}

var stack = Stack{
	arr:   [maxSize]int{},
	left:  -1,
	right: maxSize,
}

func (s *Stack) Push(val int, stackType stackType) bool {
	if s.IsFull() {
		return false
	}
	if stackType == sLeft {
		s.arr[s.left+1] = val
		s.left++
	} else {
		s.arr[s.right-1] = val
		s.right--
	}
	return true
}

func (s *Stack) Pop(stackType stackType) (val int, exist bool) {
	if stackType == sLeft {
		if s.left > -1 {
			val = s.arr[s.left]
			exist = true
			s.left--
		}
	} else {
		if s.right < maxSize {
			val = s.arr[s.right]
			exist = true
			s.right++
		}
	}
	return
}

// 两栈都为空
func (s *Stack) IsEmpty() bool {
	if s.right == maxSize && s.left == -1 {
		return true
	}
	return false
}

func (s *Stack) IsFull() bool {
	if s.right-s.left == 1 {
		return true
	}
	return false
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值