链式栈的实现

如何用C语言创建一个链栈,并进行操作 5分

1 思路: 主要是链表的插入和删除操作

2 代码

#include#includetypedef struct node{int data;struct node *next;}node_type;void push(node_type* &stack, int elem){node_type*node = (node_type*)malloc(sizeof(node_type));node->data = elem;node->next = stack;stack = node;}int pop(node_type* &stack){int elem = stack->data;node_type*node = stack;stack = stack->next;free(node);return elem;}bool IsEmpty(node_type* stack){return stack == NULL;}void display(node_type*stack){while (stack){printf("%d ", stack->data);stack = stack->next;}puts("");}void destroy(node_type*stack){while (!IsEmpty(stack)){pop(stack);}}int main(){puts("(1) 建立空链栈");node_type*stack = NULL;puts("\n(2) 调用进栈函数,将从键盘输入的数据元素逐个进栈,输入0结束;");int num;scanf("%d", &num);while (num != 0){push(stack, num);scanf("%d", &num);}puts("\n(3) 显示进栈后的数据元素");display(stack);puts("\n(4) 调用两次出栈函数,显示出栈后的数据元素");if (!IsEmpty(stack))printf("%d\n", pop(stack));if (!IsEmpty(stack))printf("%d\n", pop(stack));destroy(stack);getchar();getchar();return 0;}3 运行效果

编程实现链栈的入栈和出栈操作。 在线等着你哦!

#include#includetypedef struct Snode { int data;/*数据域*/ struct Snode *next;/*指针域*/ }SNODE,* LinkStack;/*其中SNODE为链栈中的结点类型名, LinkStack为指向结点的指针类型名*/ //////////////////LinkStack Push(LinkStack top,int e) /*将数据元素e压入到链栈top中,使其成为新的栈项元素*/ { LinkStack p; p=(LinkStack)malloc(sizeof(SNODE)); /*生成一个新的结点*/ if (!p) /*如果分配空间失败,则函数返回"OVERFLOW"*/ printf("Stack is Overflow\n"); p->data=e; /*新结点的数据域赋值*/ p->next=top; /*修改链使新结点插入到链表的头部,并成为新的栈顶元素*/ top=p; return top; } /////////////LinkStack Pop(LinkStack top, int * e) /*将链栈top中的栈顶元素从栈中删除,并用e返回其值*/ { LinkStack q; if (!top) /*如果栈空,则函数返回ERROR*/ printf("Stack is ERROR\n"); *e=top->data; /*将被删的栈顶元素的值保存在e中*/ q=top; /*用q记下待删的栈顶元素*/ top=q->next; /*修改链使待删结点从链中"卸下" ,此时被删结点的后继成为新的栈顶元素结点*/ free(q); /*释放被删结点的存储空间*/ return top;}/////////LinkStack Stack_display(LinkStack top){ int e; while(top) { e=top->data; printf("%4d",e); top=top->next; } return top;}/////////////////////void main(){ LinkStack top = 0; int i=0,n,e; printf("please input the length:");/*输入几个数*/ sca......余下全文>>

顺序栈与链式栈的区别

顺序栈的实现在于使用了数组这个基本数据结构,数组中的元素在内存中的存储位置是连续的,且编译器要求我们在编译期就要确定数组的大小,这样对内存的使用效率并不高,一来无法避免因数组空间用光而引起的溢出问题,二在系统将内存分配给数组后,则这些内存对于其他任务就不可用;而对于链栈而言,使用了链表来实现栈,链表中的元素存储在不连续的地址,由于是动态申请内存,所以我们可以以非常小的内存空间开始,另外当某个项不使用时也可将内存返还给系统。

呵呵希望采纳,具体请参考

参考资料:[hi.baidu.com]小绵羊与小排骨/blog/item/5fb2b468bcd32c7c0d33fabf.html

实现链式栈的基本操作:入栈、出栈、取栈顶元素、判定栈空、栈满。

#include

#include

#define NULL 0

typedef struct snode

{

int data;

struct snode *next;

}stack;

//

void push( stack **s,int x)

{

stack *p;

p=( stack *)malloc(sizeof(snode));

//cin> > x;

p-> data=x;

p-> next=*s;

*s=p;

}

//

void pop( stack **s )

{

stack *p;

int e = 0 ;

p=(stack *)malloc(sizeof(snode));

if(NULL == (*s))

cout < < "空战 ";

else

{

p=*s;

e=p-> data;

*s=p-> next;

cout < < "出栈的数是:\t " <

}

free(p);

}

//

void print(stack **s)

{

//stack *s;

if( *s == NULL)

cout < < "空栈 ";

else if((*s)!=NULL)

{

cout < < "出栈的数是:\t " < <(*s)-> data <

*s = (*s)-> next;

}

}

//

void stackempty(stack **s)

{

//stack *s;

if(*s == NULL)

cout < < "栈空 " <

else

cout < < "栈非空 " <

}

//

void main()

{

stack *s= NULL ;// = new stack();

int f,x,e;

puts( "输入1(入栈)或2(出栈)\n ") ;

cin> > f;

while(1)

{

switch (f)

{

case 1:

puts( "输入入栈的数:\t ") ;

cin> > x;

push(&s,x);

print(&s);

stackempty(&s);

break;

case 2:

......余下全文>>

C语言:1 编写一个程序实现顺序栈的各种基本运算 2 实现队列的链式表示和实现相关的基本操作(入队出队等) 10分

这个我会,可以帮你写!

利用顺序栈和链式栈分别栈实现十进制N和二进制数的转换。

你是猪啊。这都不会。。。你邮箱多少我发给你。。。

C语言数据结构实现链栈的入栈、出栈、删除与插入 10分

1、栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。2、例程:

#include #include #define Max 100typedef char T; typedef struct MyStack{ T aa[Max]; unsigned int p; } stack; //创建空栈stack* createEmptyStack(){ stack* st = (stack *)malloc(sizeof(stack)); int i=0; for(i=0;iaa[i]=0; st->p=0; return st; }; //栈判空int isEmpty(const stack* st){ if(st->p==0) return 1; else return 0;}; //求栈的大小unsigned int size(const stack* st){ return st->p;}; //push操作void push(stack* st,const T a){ st->p=st->p+1; if(st->p==Max) { printf("栈满\n"); st->p--; return; } st->aa[st->p]=a; }; //pop操作T pop(stack* st){ if(isEmpty(st)) { printf("栈空"); return NULL; } char t=st->aa[st->p]; st->p=st->p-1; printf("%c ",t); return t; }; //栈销毁void destroy(stack* st){ free(st);}; int main(){ stack* st = createEmptyStack(); if(isEmpty(st)) printf("MyStack is empty\n"); else printf("MyStack is not empty\n"); push(st,'a'); push(st,'b'); push(st,'c'); push(st,'d'); push(st,&......余下全文>>

编写程序实现对链栈的操作

#include#include#includetypedef int StackElementType;typedef struct LinkStackNode{ StackElementType data; struct LinkStackNode *next;}LinkStackNode;typedef struct{ struct LinkStackNode *top; //栈顶指针}LinkStack;void InitStack(LinkStack *s)//初始化链栈{ s->top=NULL; printf("\n已经初始化链栈!\n");}void ClearStack(LinkStack *s)//链栈置空{ s->top=NULL; printf("\n链栈被置空!\n");}void Push(LinkStack *s, StackElementType x)//入栈{ LinkStackNode *p; p=(LinkStackNode *)malloc(sizeof(LinkStackNode)); //建立一个节点 p->data=x; p->next=s->top; //由于是在栈顶Push,所以要指向栈顶 s->top=p; //插入}StackElementType Pop(LinkStack *s)//出栈{ StackElementType x; LinkStackNode *p; p=s->top; //指向栈顶 if (s->top==0) { printf("栈空,不能出栈!\n"); exit(-1); } x=p->data; s->top=p->next; //当前的栈顶指向原栈的next free(p); //释放 return x;}StackElementType GetTop(LinkStack *s)//取栈顶元素{ if (s->top==0) { printf("链栈为空,无栈顶元素!\n"); exit(-1); } return s->top->data;}void Disp(LinkStack *s)//链栈的遍历{ printf("\n当前链栈中的数据为:\n"); printf("=====......

数据结构:编写一个算法实现输出链栈中的所有元素(假设栈中元素的类型为char)

#include

#include

struct node{

int data;

struct node* pre;

};

void print(struct node *p)//打印链栈

{while(p)

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

p=p->pre;

}

}

int main()

{int i;

struct node *p,*q;

for(i=1;i<11;i++)//1~10依次入栈

{p=(struct node*)malloc(sizeof(struct node));

if(i==1)p->pre=NULL;

else p->pre=q;

p->data=i;

q=p;

}

print(p);

return 0;

}

链式栈的实现

分别就栈的顺序存储结构和链式存储结构实现栈的各种基本操作。

顺序存储结构

#include

typedef char ElemType;

#define MaxSize 100

using namespace std;

typedef struct

{

ElemType data[MaxSize];

int top;

}sqStack;

void InitStack(sqStack *&s);//初始化栈

void ClearStack(sqStack *&s);//摧毁栈

int StackLength(sqStack *s);//返回栈的长度

bool StackEmpty(sqStack *s);//判断栈是否为空

int Push(sqStack *&s,ElemType e);//进栈

int Pop(sqStack *&s,ElemType &e);//出栈

int GetTop(sqStack *s,ElemType &e);//取栈顶元素

void DispStack(sqStack *s);//显示栈中元素值

int main()

{

return 0;

}

void InitStack(sqStack *&s)//初始化栈

{

s=new sqStack;

s->top=-1;

}

void ClearStack(sqStack *&s)//摧毁栈

{

delete s;

}

int StackLength(sqStack *s)//返回栈的长度

{

return (s->top+1);

}

bool StackEmpty(sqStack *s)//判断栈是否为空

{

return (s->top==-1);

}

int Push(sqStack *&s,ElemType e)//进栈

{

if(s->top==MaxSize-1)

return 0;

s->top++;

s->data[s->top]=e;

return 1;

}

int Pop(sqStack *&s,ElemType &e)//出栈

{

if(s->top==-1)

return 0;

e=s->data[s->top];

s->top--;

return 1;

}

int GetTop(sqStack *s,ElemType &e)//取栈顶元素

{

if(s->top==-1)

return 0;

e=s->data[s->top];

return 1;

}

void DispStack(sqStack *s)//显示栈中元素值

{

for(int i=s->top;i>=0;i--)

cout<data[i]<<" ";

cout<

}

链式存储结构

typedef char ElemType;

typedef struct linknode

{

ElemType data;

struct linknode *next;

}LiStack;

void InitS......余下全文>>

扫一扫手机访问

发表评论