链栈-C语言版

#include<stdio.h>

#include<iostream>

#include<stdlib.h>

using namespace std;

typedef struct stacknode                           ///结构节点的定义

{

int data;

struct stacknode *next;

}StackNode,*LinkStack;

int StackEmpty(LinkStack top)                      ///栈判空

{

if(top->next==NULL)

return 1;

else

return 0;

}

void Push(LinkStack top,int value)                       ///入栈

{

StackNode * newp = (StackNode *)malloc(sizeof(StackNode));

if(newp != NULL)

{

newp->data=value;

newp->next=top->next;

top->next=newp;

}

else

cout<<"没有有效的内存空间存储新的节点"<<endl;

return ;

}

int Pop(LinkStack top)                                                    ///出栈

{

StackNode * temp;

int t;

if(StackEmpty(top))

cout<<"当前栈是空的!!!"<<endl;

else

{

temp=top->next;

t=temp->data;

top->next = temp->next;

free(temp);

}

return t;

}

void PrintStack(LinkStack top)                          ///打印操作

{

if(top->next==NULL)

cout<<"当前栈是空的!!!"<<endl;

else

{

while(top->next!=NULL)

{

cout<<top->next->data<<"  ";

top=top->next;

}

}

}

int StackTop(LinkStack top)                                 ///返回栈顶元素

{

if(StackEmpty(top))

cout<<"当前栈是空的!!!"<<endl;

return top->next->data;

}

int StackLen(LinkStack top)                            ///栈的长度

{

int len=0;

while(top->next!=NULL)

{

len++;

top=top->next;

}

return len;

}

void DestroyStack(LinkStack top)                             ///栈的销毁

{

LinkStack q;

q=top->next;

while(top!=NULL)

{                          ///这个部分那个博客人写错了,害死我了,他居然把头节点给释放掉了  汗、

top=q->next;

free(q);                ///销毁以后,原top的指向位置(他所存放的值还是之前那个,只不过此时是野指针)

q=top;

}

printf("销毁成功");

}

void InitStack(LinkStack top)                           ///初始化栈+清空操作

{

top->next=NULL;

}

void instruction(void)                                        ///功能界面说明

{

cout<<"0------退出程序"<<endl

<<"1------入栈操作"<<endl

<<"2------出栈操作"<<endl

<<"3------取栈顶元素"<<endl

<<"4------判断栈是否为空"<<endl

<<"5------返回栈的元素个数"<<endl

<<"6------####初始化栈###"<<endl

<<"7------显示栈"<<endl

<<"8------销毁栈"<<endl

<<"9------退出程序"<<endl;

}

int main()                                                                     ///主函数部分

{

LinkStack top=NULL;

top=(LinkStack)malloc(sizeof(StackNode));                   ///头节点

instruction();

int i,value;

cin>>i;

while(i)

{

switch(i)

{

case 1:

InitStack(top);

cout<<"请输入一个整数,并终止到0结束!!!"<<endl;

cin>>value;

while(value!=0)

{

Push(top,value);

cin>>value;

}

PrintStack(top);

cout<<endl;

break;

case 2:

if(top->next!=NULL)

cout<<"栈顶元素是: "<<Pop(top)<<endl;

else

cout<<"当前栈是空的!!!"<<endl;

break;

case 3:

if(StackEmpty(top)==1)

cout<<"当前栈是空的!!!"<<endl;

else

cout<<StackTop(top)<<endl;

break;

case 4:

if(StackEmpty(top)==1)

cout<<"当前栈是空的!!!"<<endl;

else

cout<<"当前栈是空的!!!"<<endl;

break;

case 5:

if(StackEmpty(top)==1)

cout<<"当前栈是空的!!!"<<endl;

cout<<StackLen(top)<<endl;

cout<<endl;

break;

case 6: InitStack(top);break;

case 7:

PrintStack(top);

cout<<endl;

break;

case 8:

DestroyStack(top);

cout<<endl;

top->next=NULL;                         ///这一步很重要,否则会造成无元素还是输出任意数的结果

break;

case 9: goto end;break;                  ///有意思的goto语句

default:

cout<<"无效的选择!!!"<<endl;

break;

}

instruction();

cin>>i;

}

end:;

return 0;

}

时间: 2024-12-16 05:06:56

链栈-C语言版的相关文章

【小白成长撸】--链栈(C语言版)

1 // 链栈.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <stdio.h> 6 #include <stdlib.h>//malloc的头文件 7 8 typedef struct line_stack//栈包装 9 { 10 int x; 11 struct line_stack *next; 12 }link; 13 14 void pushes(link **top, int

链队列-C语言版

源文件部分: 指针没学好的同学很难看懂^_^,有点乱,希望对大家有点帮助. #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<string.h> typedef int Elemtype; #include"LQueue.h" int main() { Deque head; instruction(head); return 0; } 头文件部分: type

【小白成长撸】--顺序栈(C语言版)

1 // 顺序栈.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h"//test1.0--栈表仅限Int类型 5 #include <stdio.h> 6 7 #define true 1 8 #define false 0 9 10 typedef struct stack_type 11 { 12 int stack[100];//最大容纳100个元素 13 int top; 14 }stacktype; 15 16 in

从两端生长的双向栈-C语言版

<pre name="code" class="cpp">[cpp] 简单双端栈的应用 源文件部分: #include <stdio.h> #define MaxStackSize 100 typedef int DataType; int len,x; #include"SeqStack.h" int main() { SeqStack myStack; int i,n,m; StackInitiate(&myS

链栈的c语言实现

1.链栈结构 typedef struct StackNode { SElemType data; struct StackNode *next; }StackNode,*LinkStackPtr; typedef struct { LinkStackPtr top; int count; }LinkStack; 2.构造一个空栈S Status InitStack(LinkStack *S) { S->top = (LinkStackPtr)malloc(sizeof(StackNode));

顺序栈的栈基本操作(C语言版)

由于现在只学了C语言所以就写这个C语言版的栈的基本操作 这里说一下 :网上和书上都有这种写法 int InitStack(SqStack &p) &p是取地址  但是这种用法好像C并不支持 ,C++才支持,所以用 C语言写就需要使用指针 代码如下: 1 #include <stdio.h> 2 #include <stdlib.h> 3 #define STACK_INIT_SIZE 100//储存空间初始分配量 4 #define STACKINCREMENT 1

数据结构(java语言描述)链栈的定义

1.定义栈接口 package stack;public interface Istack {    public void clear();    public boolean isEmpty();    public int length();    public Object peek();    public void push(Object x) throws Exception;    public Object pop();} 2.定义Node结点 package stack; i

C语言链栈

链栈与链表结构相似 1 typedef int elemtype; 2 3 typedef struct linkedStackNode{ 4 elemtype e; 5 struct linkedStackNode *next; 6 }LinkedStack; 7 8 LinkedStack *init_LinkedStack(){ 9 10 LinkedStack *top = (LinkedStack *)malloc(sizeof(LinkedStack)); 11 if(top==NU

数据结构 - 链栈的实行(C语言)

数据结构-链栈的实现 1 链栈的定义 现在来看看栈的链式存储结构,简称为链栈. 想想看栈只是栈顶来做插入和删除操作,栈顶放在链表的头部还是尾部呢?由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢,所以比较好的办法是把栈顶放在单链表的头部(如下图所示).另外,都已经有了栈顶在头部了,单链表中比较常用的头结点也就失去了意义,通常对于链栈来说,是不需要头结点的. 对于空栈来说,链表原定义是头指针指向空,那么链栈的空其实就是 top=NULL 的时候. 链栈的结构代码如下: /* 链栈