数据结构:栈之链栈

链栈是运算受限的单链表,即其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。

链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。(王道)

自己感觉是可以设头结点,也可以不设头结点。如果设的话,则top指向头结点;如果不设的话,则top指向第一个有效元素。

但是书上基本都不设,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点以后的结点进行操作,反而使算法更复杂,所以只要有链栈的头指针就可以了。

在栈中输入数据

 

void main(void){
    LinkStack *s = NULL;
    dataType x;
    
    initStack(&s);
    printf("***push操作***\n");
    push(s, 10);
    push(s, 20);
    push(s, 30);

    show(s);
    
    printf("***pop操作***\n");    
    pop(s, &x);
    show(s);
    
    printf("***取栈顶元素***\n");
    getTop(s, &x);
    printf("栈顶元素为:%d\n", x);
    
    destroyStack(&s);
}

 

void main(void){
    LinkStack *s = NULL;
    dataType x;
    
    initStack(&s);
    printf("***push操作***\n");
    printf("请输入要入栈的数据:");
    scanf("%d", &x);
    //while(x != '\n'){   //不能用这种形式,这种的只适合于字符 
    
while(x != 9999){
        push(s, x);
        scanf("%d", &x);
    }

    show(s);
    
        
}

遗留问题:

(*stack)->data = (ElemType *)malloc(sizeof(ElemType) * MaxSize);

free((*stack)->data);    

这样能全部释放吗?????

这个图旋转不过来了,过分。

感觉按照自己写的程序的话,(a)的top应该再往上指一个,就像(b)那样的

/*
这些程序 感觉top就像一个头结点一样 
*/
#include<stdio.h>
#include<malloc.h>

typedef unsigned char  boolean;
#define  TRUE    1
#define  FALSE   0

typedef int dataType;

typedef struct node{
	dataType data;
	struct node *next;
}LinkStack;

void initStack(LinkStack **top);
void destroyStack(LinkStack **top);
boolean push(LinkStack *top, dataType x);
boolean pop(LinkStack *top, dataType *x);  //感觉pop和取栈顶元素很像啊 
boolean isStackEmpty(LinkStack top);
void show(LinkStack *top);
boolean getTop(LinkStack *top, dataType *x);


boolean getTop(LinkStack *top, dataType *x){
	if(isStackEmpty(*top)){
		printf("栈为空,不能出栈!\n");
		return FALSE;
	}

	*x = top->next->data; 
	return TRUE;	
}


void show(LinkStack *top){
	LinkStack *p;
	
	printf("链栈中的元素有:");
	for(p = top->next; p; p = p->next){
		printf("%d ", p->data);
	}
	printf("\n");
}

boolean isStackEmpty(LinkStack top){
	return top.next == NULL;
}

boolean pop(LinkStack *top, dataType *x){
	LinkStack *p;
	
	if(isStackEmpty(*top)){
		printf("栈为空,不能出栈!\n");
		return FALSE;
	}
	
	p = top->next;
	*x = p->data;
	top->next = p->next;
	free(p);
	return TRUE; 
}

boolean push(LinkStack *top, dataType x){
	LinkStack *p;
	
	p = (LinkStack *)malloc(sizeof(LinkStack));
	p->data = x;
	p->next = top->next;
	top->next = p;
	return TRUE;
}

void destroyStack(LinkStack **top){
	LinkStack *p;
	
	for(p = (*top)->next; p; p = p->next){
		free(p);
	}
	//free(s);
	*top = NULL;   //!!!让这个指针不再乱指 
}

void initStack(LinkStack **top){
	*top = (LinkStack *)malloc(sizeof(LinkStack));
	(*top)->next = NULL;
}


/*
void main(void){
	LinkStack *s = NULL;
	dataType x;
	
	initStack(&s);
	printf("***push操作***\n");
	push(s, 10);
	push(s, 20);
	push(s, 30);
	show(s);
	
	printf("***pop操作***\n");	
	pop(s, &x);
	show(s);
	
	printf("***取栈顶元素***\n");
	getTop(s, &x);
	printf("栈顶元素为:%d\n", x);
	
	destroyStack(&s);
}
*/


void main(void){
	LinkStack *s = NULL;
	dataType x;
	
	initStack(&s);
	printf("***push操作***\n");
	printf("请输入要入栈的数据:");
	scanf("%d", &x);
	//while(x != '\n'){   //不能用这种形式,这种的只适合于字符 
	while(x != 9999){
		push(s, x);
		scanf("%d", &x);
	}
	show(s);
	
		
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

安安csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值