首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

关于链栈的有关问题

2013-06-25 
关于链栈的问题/*我创建的算不算是链栈?如果不算链栈,该如何修改?*/#includestdio.h#includestdlib.ht

关于链栈的问题
/*我创建的算不算是链栈?如果不算链栈,该如何修改?*/
#include<stdio.h>
#include<stdlib.h>
typedef struct Node//定义链栈
{
int a;
struct Node *next;
}LinkedStackNode,*LinkedStack;
void main()
{
LinkedStack LinkedStackInit();
LinkedStack LinkedStackPush(LinkedStack x,int y);
LinkedStack LinkedStackPop(LinkedStack x);
LinkedStack LinkedStackPop(LinkedStack x);
int LinkedStackGetTop(LinkedStack x);
int LinkedStackLength(LinkedStack x);
LinkedStack LinkedStackClear(LinkedStack x);

LinkedStack p;
p=LinkedStackInit();
printf("%d\n",LinkedStackEmpty(p));
p=LinkedStackPush(p,3);
printf("%d\n",p->next->a);
p=LinkedStackPop(p);
printf("%d\n",LinkedStackEmpty(p));
p=LinkedStackPush(p,3);
printf("栈顶元素为:%d\n",LinkedStackGetTop(p));
printf("栈长为:%d\n",LinkedStackLength(p));
p=LinkedStackClear(p);
printf("栈已清空\n");
}
LinkedStack LinkedStackInit()//初始化链栈
{
LinkedStack p;
p=malloc(sizeof(LinkedStackNode));
p->next=NULL;
}
int LinkedStackEmpty(LinkedStack x)//判空
{
if(x->next==NULL)
return 1;
else
return 0;
}
LinkedStack LinkedStackPush(LinkedStack x,int y)//入栈
{
LinkedStack p=x,p2;
while(p->next!=NULL)
p=p->next;
p2=malloc(sizeof(LinkedStackNode));
p->next=p2;
p2->a=y;
p2->next=NULL;
return x;
}
LinkedStack LinkedStackPop(LinkedStack x)//出栈
{
LinkedStack p=x,p2;
if(x->next==NULL)
{
printf("栈空,无法出栈");
exit(0);
}
else
{
while(p->next->next!=NULL)
p=p->next;
p2=p->next;
free(p2);
p->next=NULL;
return x;
}
}
int LinkedStackGetTop(LinkedStack x)//取栈顶元素
{
LinkedStack p=x;
if(x->next==NULL)
{
printf("栈空");
exit(0);
}
else
{
while(p->next!=NULL)
p=p->next;
return p->a;
}
}
int LinkedStackLength(LinkedStack x)//求栈长
{
int length=0;
LinkedStack p=x;
while(p->next!=NULL)
{
p=p->next;
length++;
}
return length;
}
LinkedStack LinkedStackClear(LinkedStack x)//清空栈
{
x->next=NULL;
return x;
}
链栈
[解决办法]
看着差不多,但是你的实现非常的低效,每次的push跟pop操作都需要遍历找到队列尾部,我没说错吧
为什么不直接维护一个头指针,插入的时候直接p->next = head; head = p;然后出栈的时候直接head->next != NULL ? head = head->next : NULL呢,这样多方便,O(1)的时间复杂度
[解决办法]


#include<stdio.h>
#include<stdlib.h>

typedef struct Node//定义链栈
{
    int a;
    struct Node *next;
}LinkedStackNode,*LinkedStack;


LinkedStack LinkedStackInit();
LinkedStack LinkedStackPush(LinkedStack x,int y);


int LinkedStackEmpty(LinkedStack x);
LinkedStack LinkedStackPop(LinkedStack x);
int LinkedStackGetTop(LinkedStack x);
int LinkedStackLength(LinkedStack x);
LinkedStack LinkedStackClear(LinkedStack x);

int main(int argc, char *argv[] )
{
    LinkedStack p;
    p=LinkedStackInit();
    printf("%d\n",LinkedStackEmpty(p));
    p=LinkedStackPush(p,3);
    printf("%d\n",p->next->a);
    p=LinkedStackPop(p);
    printf("%d\n",LinkedStackEmpty(p));
    p=LinkedStackPush(p,3);
    printf("栈顶元素为:%d\n",LinkedStackGetTop(p));
    printf("栈长为:%d\n",LinkedStackLength(p));
    p=LinkedStackClear(p);
    printf("栈已清空\n");
}

LinkedStack LinkedStackInit()//初始化链栈
{
    LinkedStack p;
    p=(LinkedStack)malloc(sizeof(LinkedStackNode));
    p->next=NULL;

    return p;
}

int LinkedStackEmpty(LinkedStack x)//判空
{
    if(x->next==NULL)
        return 1;
    else
        return 0;
}

LinkedStack LinkedStackPush(LinkedStack x,int y)//入栈
{
    LinkedStack p=x,p2;
    while(p->next!=NULL)
        p=p->next;
    p2=(LinkedStack)malloc(sizeof(LinkedStackNode));
    p->next=p2;
    p2->a=y;
    p2->next=NULL;
    
    return x;
}

LinkedStack LinkedStackPop(LinkedStack x)//出栈
{
    LinkedStack p=x,p2;
    if(x->next==NULL)
    {
        printf("栈空,无法出栈");
        exit(0);
    }
    else
    {
        while(p->next->next!=NULL)
            p=p->next;
        p2=p->next;
        free(p2);
        p->next=NULL;
        return x;
    }
}

int LinkedStackGetTop(LinkedStack x)//取栈顶元素
{
    LinkedStack p=x;
    if(x->next==NULL)
    {
        printf("栈空");
        exit(0);
    }
    else
    {
        while(p->next!=NULL)
            p=p->next;
        return p->a;
    }
}

int LinkedStackLength(LinkedStack x)//求栈长
{
    int length=0;
    LinkedStack p=x;
    while(p->next!=NULL)


    {
        p=p->next;
        length++;
    }
    return length;
}

LinkedStack LinkedStackClear(LinkedStack x)//清空栈
{
    x->next=NULL;
    return x;
}

热点排行