如何有效地在单个阵列中实现3个堆栈?

问题描述

| 这是一个python代码..是否使用链表实现..以这种方式高效...........
data = []            # data storage for stacks represented as linked lists
stack = [-1,-1,-1] # pointers to each of three stacks (-1 is the \"null\" pointer)
free = -1            # pointer to list of free stack nodes to be reused

def allocate(value):
    \'\'\' allocate a new node and return a pointer to it \'\'\'
    global free
    global data
    if free == -1:
        # free list is empty,need to expand data list
        data += [value,-1]
        return len(data)-2
    else:
        # pop a node off the free list and reuse it
        temp = free
        free = data[temp+1]
        data[temp] = value
        data[temp+1] = -1
        return temp

def release(ptr):
    \'\'\' put node on the free list \'\'\'
    global free
    temp = free
    free = ptr
    data[free+1] = temp

def push(n,value):
    \'\'\' push value onto stack n \'\'\'
    global free
    global data
    temp = stack[n]
    stack[n] = allocate(value)
    data[stack[n]+1] = temp

def pop(n):
    \'\'\' pop a value off of stack n \'\'\'
    value = data[stack[n]]
    temp = stack[n]
    stack[n] = data[stack[n]+1]
    release(temp)
    return value

def list(ptr):
    \'\'\' list contents of a stack \'\'\'
    while ptr != -1:
        print data[ptr],ptr = data[ptr+1]
    print

def list_all():
    \'\'\' list contents of all the stacks and the free list \'\'\'
    print stack,free,data
    for i in range(3):
        print i,\":\",list(stack[i])
    print \"free:\",list(free)

push(0,\"hello\")
push(1,\"foo\")
push(0,\"goodbye\")
push(1,\"bar\")
list_all()
pop(0)
pop(0)
push(2,\"abc\")
list_all()
pop(1)
pop(2)
pop(1)
list_all()
除了这种方法,还有任何有效的方法吗?在c / c ++中以这种方式实现将是有效的?     

解决方法

        在python中,列表是一个堆栈:
>>> l = [1,2,3,4,5]
>>> l.pop()
5
>>> l.pop()
4
>>> l.append(9)
>>> l
[1,9]
>>> l.pop()
9
>>> l.pop()
3
>>> l.append(12)
>>> l
[1,12]
尽管在python中实现c样式的链表可能是一个有趣的练习,但这是不必要的,并且可能非常慢。只需使用列表即可。     ,        更好的解决方案是使用列表而不是堆栈来实现链接列表。给出的代码是链表的堆栈实现,我相信这是python中的一种规范,但在C / C ++中,您可以使用链表进行有效实现。 C语言中的示例代码如下:
#include <stdio.h>
#include <stdlib.h>

struct node{
    int data;
    struct node *next;
};

struct node* add(struct node *head,int data){
    struct node *tmp;

    if(head == NULL){
        head=(struct node *)malloc(sizeof(struct node));
        if(head == NULL){
            printf(\"Error! memory is not available\\n\");
            exit(0);
        }
        head-> data = data;
        head-> next = head;
    }else{
        tmp = head;

        while (tmp-> next != head)
            tmp = tmp-> next;
        tmp-> next = (struct node *)malloc(sizeof(struct node));
        if(tmp -> next == NULL)
        {
            printf(\"Error! memory is not available\\n\");
            exit(0);
        }
        tmp = tmp-> next;
        tmp-> data = data;
        tmp-> next = head;
    }
    return head;
}

void printlist(struct node *head)
{
    struct node *current;
    current = head;
    if(current!= NULL)
    {
        do
        {
            printf(\"%d\\t\",current->data);
            current = current->next;
        } while (current!= head);
        printf(\"\\n\");
    }
    else
        printf(\"The list is empty\\n\");

}

void destroy(struct node *head)
{
    struct node *current,*tmp;

    current = head->next;
    head->next = NULL;
    while(current != NULL) {
        tmp = current->next;
        free(current);
        current = tmp;
    }
}
void main()
{
    struct node *head = NULL;
    head = add(head,1); /* 1 */
    printlist(head);

    head = add(head,20);/* 20 */
    printlist(head);

    head = add(head,10);/* 1 20 10 */
    printlist(head);

    head = add(head,5); /* 1 20 10 5*/
    printlist(head);

    destroy(head);
    getchar();
}
在上面的示例中,如果创建一个大小为3的指针数组,每个指针都指向head,则可以创建三个链接列表。这将以最大的效率处理空间,也无需检查空闲节点。     ,        
def finding_element(a,k):
    print a
    i = 0
    while k < a[i]:
        i = i-1
        print k,a[i]
        if k > a[i]:
            i = i+1
            print k,a[i]
            if k == a[i]:
                print k,a[i]
    else:
        print \"not found\"

a = [ 1,5,7,8,9]
k = 5
finding_element(a,k)
    

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...