1.初始化.
2.入栈.
3.出栈.
4.取栈顶元素.
5.栈的遍历及输出.
注:
1.链栈不需要设置头结点,由于链栈的插入和删除元素都在只能在栈顶 操作。
2.栈分外部结构和内部结构,外部结构是指栈顶指针top;内部结构是指栈的结点环环相扣,链栈的内部结构类似于单链表但,next的指向方向不同,链栈是由栈顶指向栈底,即从后往前指,而单链表是从前往后指,注意区别!
3. 在链栈出栈操作中,需注意要存放出栈元素,须先在主函数定义一个dataType类型的变量elem(注意是“ 变量 ”而不是 “ 指针变量 ”),然后调用出栈函数时将elem的地址传给形参,即pop_out(&s,&elem),通过变量地址传入函数间接访问的方式,才能成功的用elem存取出栈元素的值。
4. 我好啰嗦。
#include <stdio.h>
#include <stdlib.h>
typedef int dataType; /*存放整型变量的栈定义dataType类型为int,
若存放其他类型的栈可直接修改此处,
将int类型替换成其他类型即可*/
typedef struct node /*栈的内部结构,即栈的结点*/
{
dataType data;
struct node *next;
}StackNode;
typedef struct stack /*栈的外部结构*/
{
StackNode *top; /*栈顶指针*/
int length; /*栈的结点数(元素个数)*/
}LinkStack;
int initialize(LinkStack *s) /*1.栈的初始化*/
{
s->top=NULL; /*栈顶指针置空*/
s->length=0; /*栈顶元素初始值为0,结点数也为0*/
}
int push_in(LinkStack *s,dataType value) /*2.入栈,链栈与顺序栈不同,链栈入栈不需要判断栈满*/
{
StackNode *p;
p=(StackNode *)malloc(sizeof(StackNode));
p->data=value;
p->next=s->top;
s->top=p;
s->length++;
return;
}
int pop_out(LinkStack *s,dataType *value) /*3.出栈,需判断栈是否为空*/
{
StackNode *p;
if(s->length==0)
{
printf("LinkStack is Empty!\n");
return;
}
p=s->top;
*value=s->top->data; /*此步操作是用于存放出栈的元素,注意事项见注释3*/
s->top=p->next;
s->length--;
printf("Pop Element is %d. \n",*value);
return;
}
dataType getTop(LinkStack *s)
{
if(s->length==0)
{
printf("LinkStack is Empty!\n");
return;
}
return(s->top->data);
}
void traverse(LinkStack *s) /*4.栈的遍历及输出*/
{
StackNode *p;
int i;
if(s->length==0)
{
printf("LinkStack is Empty!\n");
return;
}
p=s->top;
printf("The elements in the stack are: ");
for(i=0;i<s->length;i++)
{
printf("%d -> ",p->data); /*从栈顶指向栈底部 */
p=p->next;
}
printf("Stack Base\n");
return;
}
int main()
{
LinkStack s;
dataType elem;
return 0;
}