使用Go语言实现堆栈(Stack)

今天用Go实现了一个Stack, 提供了如下方法:

//放入元素
func (stack *Stack)Push(value ...interface{})

//返回下一个元素
func (stack *Stack)Top()(value interface{})

//返回下一个元素,并从Stack移除元素
func (stack *Stack)Pop()(err error)

//交换Stack
func (stack *Stack)Swap(other *Stack)

//修改指定索引的元素
func (stack *Stack)Set(idx int,value interface{})(err error)

//返回指定索引的元素
func (stack *Stack)Get(idx int)(value interface{})

//是否为空
func (stack *Stack)Empty()(bool)

//打印
func (stack *Stack)Print()

测试代码:

package main

//Stack
//author:Xiong Chuan Liang
//date:2015-1-30

import (
	"fmt"
	"github.com/xcltapestry/xclpkg/algorithm"
)

func main(){

	stack := algorithm.NewStack()
	if stack.Empty() {
		fmt.Println("Stack为空! ")
	}else{
		fmt.Println("Stack不为空! ",stack.Size())
	}

	stack.Push(10)
	stack.Push(20)
	stack.Push(30)
	stack.Push(40)
	fmt.Println("当前Size() = ",stack.Size())
	stack.Print()

	fmt.Println("当前Top() = ",stack.Top())

	stack.Pop()
	fmt.Println("执行完Pop()后的Top() = ",stack.Top())
	stack.Print()

	stack.Set(2,900)
	fmt.Println("\n执行完Set(2,900)后的Stack")
 	stack.Print()

	fmt.Println("\nGet()查看指定的元素: ")
	fmt.Println("当前idx为1的元素 = ",stack.Get(1))
	fmt.Println("当前idx为2的元素 = ",stack.Get(2))

	stack2 := algorithm.NewStack()
	stack2.Push("111")
	stack2.Push("222")
	fmt.Println("\nstack2的初始内容:")
	stack2.Print()

	stack.Swap(stack2)
	fmt.Println("Swap()后stack的内容:")
	stack.Print()
	fmt.Println("Swap()后stack2的内容:")
	stack2.Print()

	fmt.Println("\nstack增加字符串元素: ")
	stack.Push("中文元素")
	stack.Push("elem1")
	stack.Print()

}

运行效果:

Stack为空!
当前Size() =  4
3 => 40
2 => 30
1 => 20
0 => 10
当前Top() =  40
执行完Pop()后的Top() =  30
2 => 30
1 => 20
0 => 10

执行完Set(2,900)后的Stack
2 => 900
1 => 20
0 => 10

Get()查看指定的元素:
当前idx为1的元素 =  20
当前idx为2的元素 =  900

stack2的初始内容:
1 => 222
0 => 111
Swap()后stack的内容:
1 => 222
0 => 111
Swap()后stack2的内容:
2 => 900
1 => 20
0 => 10

stack增加字符串元素:
3 => elem1
2 => 中文元素
1 => 222
0 => 111

实现代码放在Github上 : https://github.com/xcltapestry/xclpkg/blob/master/algorithm/stack.go

C++ STL的stack相关可查: http://www.cplusplus.com/reference/stack/stack/stack/

MAIL: [email protected]

BLOG: http://blog.csdn.net/xcl168

时间: 2024-11-04 23:36:42

使用Go语言实现堆栈(Stack)的相关文章

java中堆栈(stack)和堆(heap)(还在问静态变量放哪里,局部变量放哪里,静态区在哪里.....进来)

(1)内存分配的策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. 静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编 译时就可以给他们分配固定的内存空间.这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为 它们都会导致编译程序无法计算准确的存储空间需求. 栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存 储分配相反,在栈式存储方案中,程序对

java中堆栈(stack)和堆(heap)

原文地址:http://blog.csdn.net/jerryao/article/details/874101 1.内存分配策略 按照编译原理的观点,程序运行时的内存分配有三种策略,分别是静态的,栈式的,和堆式的. (1)静态存储分配是指在编译时就能确定每个数据目标在运行时刻的存储空间需求 (2)栈式存储分配也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的.和静态存储分配相反,在栈式存储方案中,程序对数据区的需求在编译时是完全未知的,只有到运行的时候才能够知道,但是规定在运行中进入一个

Go语言的堆栈分析

本文为理解翻译,原文地址:http://www.goinggo.net/2015/01/stack-traces-in-go.html Introduction 在Go语言中有一些调试技巧能帮助我们快速找到问题,有时候你想尽可能多的记录异常但仍觉得不够,搞清楚堆栈的意义有助于定位Bug或者记录更完整的信息. 本文将讨论堆栈跟踪信息以及如何在堆栈中识别函数所传递的参数. Functions 先从这段代码开始: Listing 1 01 package main 02 03 func main()

C语言,获得堆栈增长方向的一种方法

转载:http://blog.chinaunix.net/uid-2413049-id-109836.html 在阅读wget源代码的过程中,发现一个用C语言实现,获得堆栈增长方向的巧妙方法 wget版本为1.11.4 实现代码: static voidfind_stack_direction (){  static char *addr = NULL;     /* Address of first `dummy', once known.  */  auto char dummy;     

java集合框架:浅谈如何使用LInkedList实现队列(Queue)和堆栈(Stack)

Java中的LinkedList?是采用双向循环列表实现的.利用LinkedList?可以实现栈(stack).队列(queue) 下面写两个例子学生类:int stuId; public int getStuId() { return stuId; } public void setStuId(int stuId) { this.stuId = stuId; } public String getStuName() { return stuName; } public void setStuN

堆栈 & Stack and Heap

What's the difference between a stack and a heap? The differences between the stack and the heap can be confusing for many people. So, we thought we would have a list of questions and answers about stacks and heaps that we thought would be very helpf

堆栈stack源码

/**stack.h *****/ #include <iostream>using namespace std; template <class T>class Stack{public:Stack(int maxsize = 10);~Stack(){delete stack;} T Top(); void push(const T & x); void pop(); bool empty(); private:int top;T * stack;int maxtop;

c语言基础----堆栈队列链表

堆 堆则是一种经过排序的树形数据结构,常用来实现优先队列,他的特点在于形成某种优先的结构.在计算机经常用到,比如优先队列,或者是优先进程管理. 堆(也叫二叉堆)的性质: 1.任何一个节点,都不大于他的父亲节点. 2.必须是一颗完全二叉树 栈 在数据结构中,栈是一种可以实现“先进后出”(或者称为“后进先出”)的存储结构.假设给定栈 S=(a0,a1,…,an-1),则称 a0 为栈底,an-1 为栈顶.进栈则按照 a0,a1,…,an-1 的顺序进行进栈:而出栈的顺序则需要反过来,按照“后存放的先

打印python的堆栈stack

import sys def pstack(depth = 0): frame = sys._getframe(depth) cnt = 0 while frame: print "###", cnt, frame.f_code.co_name, frame.f_code.co_filename, frame.f_lineno frame = frame.f_back cnt = cnt + 1 def test(): pstack(0) print "-"*20