august 发表于 2007-9-2 22:50:46

关于链实现的栈

#include<stdio.h>
#include<malloc.h>
typedef struct linknode
{
    char data;
    struct linknode *next;
}linkstack;
void initstack(linkstack **s)      // 初始化栈
{
    *s=NULL;
}
void push(linkstack **s,char x)      // 入栈
{
    linkstack *q,*q1;
    q1=*s;
    q=(linkstack *)malloc(sizeof(linkstack));
    q->data=x;
    q->next=*s;
    *s=q;
}
void pop(linkstack **s)            // 出栈
{
    linkstack *t;
    if(*s==NULL) printf("栈下溢出!\n");
    else
    {
      t=*s;
      *s=t->next;
      free(t);
    }
}
char gettop(linkstack **s)         // 取栈顶元素
{
    if(*s==NULL) return -1;
    else return((*s)->data);
}
int empty(linkstack **s)             // 判断是否为空
{
    if(*s==NULL) return 1;
    else return 0;
}
void display(linkstack **s)         // 显示所有元素
{
    linkstack *q;
    printf("栈中元素:");
    q=*s;
    while(q!=NULL)
    {
      printf("%c ",q->data);
      q=q->next;
    }
    printf("\n");
}
void main()
{
    linkstack *stack;
    printf("建立空栈\n");
    initstack(&stack);
    printf("栈空:%d\n",empty(&stack));
    printf("依次插入a,b,c,d\n");
    push(&stack,'a');
    push(&stack,'b');
    push(&stack,'c');
    push(&stack,'d');
    display(&stack);
    printf("退一次栈\n");
    pop(&stack);display(&stack);
}
偶想问下入栈的那部分,最后的一句 *s=q;   是不是每次插入后,使栈顶的元素地址就是刚刚插入的那个地址呢?

coolpay64 发表于 2007-9-4 19:04:58

august君幹嘛用malloc中的stack!? 用STL中的stack還不夠好嗎。。。

shawind 发表于 2007-9-4 19:54:41

我猜有两个可能
1.要打好坚实的基础,所以先学c实现的数据结构。
2.还不知道C++中的STL就包括了数据结构的实现

august 发表于 2007-9-4 22:54:58

STL具体是干嘛偶都还没搞懂,

coolpay64 发表于 2007-9-5 14:53:23

學好e文到C++.com看吧。。。
STL->Standard Template Library
就是一羣JQ的家伙,用了Template的技巧,寫了一堆程序和資料結構出來,而所有的資料型態(包括自定義)也可以使用這些物事


struct ltstr
{
bool operator()(const char* s1, const char* s2) const
{
    return strcmp(s1, s2) < 0;
}
};

int main()
{
map<const char*, int, ltstr> months;
months["january"] = 31;
...


這種用法沒看過吧。。這只是STL的其中一種用法而已

august 发表于 2007-9-5 16:58:54

还是先打好基础吧...............

诸神的曙光 发表于 2007-9-6 15:04:12

学习时候实现数据结构是好习惯,楼主加油
页: [1]
查看完整版本: 关于链实现的栈