链栈是运算受限的单链表,即其插入和删除操作只能在表头位置上进行。因此,链栈没有必要像单链表那样附加头结点,栈顶指针top就是链表的头指针。
链栈的优点是便于多个栈共享存储空间和提高其效率,且不存在栈满上溢的情况。通常采用单链表实现,并规定所有操作都是在单链表的表头进行的。(王道)
自己感觉是可以设头结点,也可以不设头结点。如果设的话,则top指向头结点;如果不设的话,则top指向第一个有效元素。
但是书上基本都不设,因为栈都是在头部进行操作的,如果加了头结点,等于要对头结点以后的结点进行操作,反而使算法更复杂,所以只要有链栈的头指针就可以了。
在栈中输入数据
| ||
遗留问题: (*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);
}