- make ArrayStack make use of our ArrayList

- add Values() method to stacks interface
- write tests
pull/1/head
emirpasic 10 years ago
parent 28f559cc09
commit 8e5760a16e

@ -82,7 +82,6 @@ func (list *List) Remove(index int) {
return return
} }
list.elements[index] = nil // cleanup reference
copy(list.elements[index:], list.elements[index+1:list.size]) // shift to the left by one (slow operation, need ways to optimize this) copy(list.elements[index:], list.elements[index+1:list.size]) // shift to the left by one (slow operation, need ways to optimize this)
list.size -= 1 list.size -= 1

@ -58,7 +58,9 @@ func (stack *Stack) Push(value interface{}) {
// Pops (removes) top element on stack and returns it, or nil if stack is empty. // Pops (removes) top element on stack and returns it, or nil if stack is empty.
// Second return parameter is true, unless the stack was empty and there was nothing to pop. // Second return parameter is true, unless the stack was empty and there was nothing to pop.
func (stack *Stack) Pop() (value interface{}, ok bool) { func (stack *Stack) Pop() (value interface{}, ok bool) {
return stack.list.Get(stack.list.Size() - 1) value, ok = stack.list.Get(stack.list.Size() - 1)
stack.list.Remove(stack.list.Size() - 1)
return
} }
// Returns top element on the stack without removing it, or nil if stack is empty. // Returns top element on the stack without removing it, or nil if stack is empty.
@ -79,15 +81,15 @@ func (stack *Stack) Size() int {
// Removes all elements from the stack. // Removes all elements from the stack.
func (stack *Stack) Clear() { func (stack *Stack) Clear() {
return stack.list.Clear() stack.list.Clear()
} }
// Returns all elements in the stack (LIFO order). // Returns all elements in the stack (LIFO order).
func (stack *Stack) Values() []interface{} { func (stack *Stack) Values() []interface{} {
size := stack.list.Size() size := stack.list.Size()
elements := make([]interface{}, size, size) elements := make([]interface{}, size, size)
for i := size - 1; i >= 0; i-- { // in reverse for i := 1; i <= size; i++ {
elements[i] = stack.list.Get(i) elements[size-i], _ = stack.list.Get(i - 1) // in reverse (LIFO)
} }
return elements return elements
} }
@ -95,7 +97,7 @@ func (stack *Stack) Values() []interface{} {
func (stack *Stack) String() string { func (stack *Stack) String() string {
str := "ArrayStack\n" str := "ArrayStack\n"
values := []string{} values := []string{}
for _, value := range stack.elements { for _, value := range stack.list.Values() {
values = append(values, fmt.Sprintf("%v", value)) values = append(values, fmt.Sprintf("%v", value))
} }
str += strings.Join(values, ", ") str += strings.Join(values, ", ")

@ -27,7 +27,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package arraystack package arraystack
import ( import (
"github.com/emirpasic/gods/utils"
"testing" "testing"
) )
@ -44,8 +43,8 @@ func TestArrayStack(t *testing.T) {
stack.Push(2) stack.Push(2)
stack.Push(3) stack.Push(3)
if actualValue := stack.Values(); !utils.IdenticalSlices(actualValue, []interface{}{3, 2, 1}) { if actualValue := stack.Values(); actualValue[0].(int) != 3 || actualValue[1].(int) != 2 || actualValue[2].(int) != 1 {
t.Errorf("Got %v expected %v", actualValue, []interface{}{3, 2, 1}) t.Errorf("Got %v expected %v", actualValue, "[3,2,1]")
} }
if actualValue := stack.Empty(); actualValue != false { if actualValue := stack.Empty(); actualValue != false {
@ -82,8 +81,8 @@ func TestArrayStack(t *testing.T) {
t.Errorf("Got %v expected %v", actualValue, true) t.Errorf("Got %v expected %v", actualValue, true)
} }
if actualValue := stack.Values(); !utils.IdenticalSlices(actualValue, []interface{}{}) { if actualValue := stack.Values(); len(actualValue) != 0 {
t.Errorf("Got %v expected %v", actualValue, []interface{}{}) t.Errorf("Got %v expected %v", actualValue, "[]")
} }
} }

@ -100,11 +100,10 @@ func (stack *Stack) Clear() {
// Returns all elements in the stack (LIFO order). // Returns all elements in the stack (LIFO order).
func (stack *Stack) Values() []interface{} { func (stack *Stack) Values() []interface{} {
size := stack.list.Size() elements := make([]interface{}, stack.size, stack.size)
elements := make([]interface{}, size, size)
element := stack.top element := stack.top
for index := 0; element != nil; index++ { for index := 0; element != nil; index++ {
elements[index] = element elements[index] = element.value
element = element.next element = element.next
} }

@ -27,7 +27,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
package linkedliststack package linkedliststack
import ( import (
"github.com/emirpasic/gods/utils"
"testing" "testing"
) )
@ -44,8 +43,8 @@ func TestLinkedListStack(t *testing.T) {
stack.Push(2) stack.Push(2)
stack.Push(3) stack.Push(3)
if actualValue := stack.Values(); !utils.IdenticalSlices(actualValue, []interface{}{3, 2, 1}) { if actualValue := stack.Values(); actualValue[0].(int) != 3 || actualValue[1].(int) != 2 || actualValue[2].(int) != 1 {
t.Errorf("Got %v expected %v", actualValue, []interface{}{3, 2, 1}) t.Errorf("Got %v expected %v", actualValue, "[3,2,1]")
} }
if actualValue := stack.Empty(); actualValue != false { if actualValue := stack.Empty(); actualValue != false {
@ -82,8 +81,8 @@ func TestLinkedListStack(t *testing.T) {
t.Errorf("Got %v expected %v", actualValue, true) t.Errorf("Got %v expected %v", actualValue, true)
} }
if actualValue := stack.Values(); !utils.IdenticalSlices(actualValue, []interface{}{}) { if actualValue := stack.Values(); len(actualValue) != 0 {
t.Errorf("Got %v expected %v", actualValue, []interface{}{}) t.Errorf("Got %v expected %v", actualValue, "[]")
} }
} }

@ -1,14 +0,0 @@
package utils
// order and elements in the two slices have to match
func IdenticalSlices(s1 []interface{}, s2 []interface{}) bool {
if len(s1) != len(s2) {
return false
}
for i := 0; i < len(s1); i++ {
if s1[i] != s2[i] {
return false
}
}
return true
}
Loading…
Cancel
Save