链栈如何定义?

JavaScript05

链栈如何定义?,第1张

#include<stdio.h>

#include<malloc.h>

typedef int ElemType

typedef struct linknode

{

ElemType data //数据域

struct linknode *next //指针域

}LiStack //链栈类型的定义

//初始化栈

void InitStack(LiStack *&s)

{

s=(LiStack *)malloc(sizeof(LiStack))

s->next=NULL

}

//销毁栈

void ClearStack(LiStack *&s)

{

LiStack *p=s->next

while(p!=NULL)

{

free(s)

s=p

p=p->next

}

free(s)//

}

//求战的长度

void StackLength(LiStack *s)

{

int i=0

LiStack *p

p=s->next

while(p!=NULL)

{

i++

p=p->next

}

printf("目前此栈的长度为: %d\n",i)

}

//判断栈是否为空栈

void StackEmpty(LiStack *s)

{

if(s->next==NULL)

printf("目前此栈是空栈n")

else

printf("目前此栈不是空栈\n")

}

//进栈

void Push(LiStack *&s,ElemType e)

{

LiStack *p

p=(LiStack *)malloc(sizeof(LiStack))

p->data=e

p->next=s->next //插入*p结点作为第一个数据结点

s->next=p

}

//出栈

void Pop(LiStack *&s,ElemType &e)

{

LiStack *p

if(s->next==NULL)

{

printf("目前此栈是空栈,此次出栈失败了!\n")

}

else

{

p=s->next //p指向第一个数据结点

e=p->data

s->next=p->next

free(p)

printf("此次出栈成功,出栈元素是:%d\n",e)

}

}

//取栈顶元素

void GetTop(LiStack *s,ElemType &e)

{

LiStack *p

p=s->next

if(p==NULL)

printf("目前此栈是空栈,此次取栈顶元素失败了\n")

else

{

e=p->data

printf("此次取栈顶的元素是:%d\n",e)

}

}

//显示栈中元素

void DispStack(LiStack *s)

{

LiStack *p

p=s->next

if(p==NULL)

printf("此栈目前是空栈\n")

else

{

printf("下面输出链栈里的各个元素:\n")

while(p!=NULL)

{

printf("%d ",p->data)

p=p->next

}

printf("\n")

}

}

void main()

{

LiStack *s

int e

InitStack(s)

printf("请输入一个进栈元素:\n")

scanf("%d",&e)

while(e!=0)

{

Push(s,e)

DispStack(s)

StackLength(s)

printf("请输入一个进栈元素:\n")

scanf("%d",&e)

}

StackEmpty(s)

GetTop(s,e)

int i

printf("如果你想出栈元素,请按1\n")

scanf("%d",&i)

while(i==1)

{

Pop(s,e)

DispStack(s)

StackLength(s)

printf("如果你想继续出栈元素,请按1\n")

scanf("%d",&i)

}

printf("链栈的基本运算,到此操作完毕了哦!\n")

}

链式栈就是用链式存储结构表示一个栈,也就是指针域。

根据栈的性质,知道栈是先进后出,所以只需要设置一个栈顶指针,还是说点C++吧

先构造一个结构模板

template<class

ElemType>

typedef

struct

Node

//建立

{

ElemType

data//数据成员,用于存储

struct

Node*next//指针成员,用于连接逻辑结构

}LNode

1.构造一个空栈,只需要:

LNode*head//定义栈顶指针

head=(LNode*)malloc(sizeof(LNode))//分配空间

head->next=NULL//下一个为空

2.新节点:比如新节点数据位1

入栈操作:

LNode*p

p->data=1

p->next=head

head=p

总之有点类似C语言里的链表

还有什么不清楚的可以追问

希望对你有所帮助!!!

#include <stdio.h>

#include <malloc.h>

struct stack

{

int number

struct stack *next

}

struct stack *top//指向栈顶

struct stack *p//临时指针

//创建链栈

void create(int first_value)

{

p = (struct stack*)malloc(sizeof(struct stack))//申请内存空间

p->number = first_value//给栈底赋值

p->next = NULL//栈底的指针为空

top = p//栈顶指向栈底

}

//进栈

void input(int value)

{

p = (struct stack*)malloc(sizeof(struct stack))//申请内存空间

p->number = value//赋值

p->next = top//指向原来的栈顶

top = p//栈顶往上移动一位

}

//出栈

void output()

{

p = top//p = 栈顶

top = top->next//栈顶往下移动一位

free(p)//释放p

}

//清空栈

void clear()

{

while(top->next != NULL)//如果不是栈底

output()//出栈

free(top)//释放栈顶

}

//取栈顶元素

int topElement()

{

return top->number

}

int main()

{

int i

create(0)

for(i=1i<=10i++)

input(i)

//clear()

printf("\n栈的内容:\n")

for(p=topp=p->next)

{

printf("%d\n",p->number)

if(p->next == NULL)

break

}

printf("栈顶元素=%d\n",topElement())

}