链栈的实现:⑴ 建立一个空栈 ⑵ 对已建立的栈进行插入、删除、取栈顶元素等基本操作

链栈的实现

⑴ 建立一个空栈;

⑵ 对已建立的栈进行插入、删除、取栈顶元素等基本操作。

#include<stdio.h>
#include<stdlib.h> //malloc函数需要用到 

typedef struct Node
{
	int data;
	struct Node *next;
}Node,*LinkStack;//LinkStack为结构体指针类型的别名  用他声明的即为结构体指针变量 
 
//链栈的初始化 
 void initStack(LinkStack *top)  //形参是指向结构体指针变量的一个指针 
{   
	*top=(Node*)malloc(sizeof(Node));  /*带头结点的单链表  
	*top就是主函数中的top结构体指针变量的地址 这里是将主函数中的top指针改变成头结点的样式*/ 
	(*top)->next=NULL; //初始化即top头结点的next域为空          
} 

//进栈 ,将元素压入栈中 
void Push(LinkStack top,int n)
{		
	Node *temp;
	temp=(Node *)malloc(sizeof(Node));  //结点申请空间 
	temp->data=n;
	temp->next=top->next;          //采用头插法存储元素 
	top->next=temp; 
} 
//栈顶元素出栈 
int Pop(LinkStack top,int *ptr)         
{           
	int a;
	Node *temp;
	if((*top).next==NULL)   //指针引用结构体成员的方式为 (*指针).成员  或者  指针->成员 
	{               //栈为空,出栈失败 
		printf("下溢错误,删除失败\n");
		return 0;
	}
	else
	{
		temp=top->next;
		a=temp->data;
		top->next=temp->next;
		free(temp);
		*ptr=a;
		return 1;
	}  
}

//获读取栈顶元素 
int GetTop(LinkStack top,int *ptr)        
{    
	if(top->next==NULL)              //栈为空,读取栈顶元素失败 
	{ 
		printf("下溢错误,取栈顶失败\n");
		return 0;
	}
	else
	{
		*ptr=top->next->data;           //读取栈顶元素,不出栈 
		return 1;
	}
}


//判空操作 
int Empty(LinkStack top)
{
	if(top->next == NULL)
	return 1;
	else
	return 0;
}

//销毁链栈 
void DestoryStack(LinkStack top)
{
	Node *p = top;
	while(top!=NULL)
	{
		top = top->next;
		free(p);
		p = top;
	}
}
 
int main()
{
	int x;
	LinkStack top;  /*定义一个结构体指针top*/
	initStack(&top); /*top指针的地址传给它   指针传递   改变值  */
	/*类似于   x=5;fun(x); fun(int x){x=2;}这时候不改变x的值  在主函数中x的值仍为5  */ 
	/*x=5; fun(&x);   fun(int *x){*x=2};}  这时候改变了x的值  在主函数里x的值变为了2*/
	printf("对15和10执行入栈操作\n");
	Push(top,15);
	Push(top,10); 
	if(GetTop(top,&x)==1)
		printf("当前栈顶元素为:%d\n",x);
	if(Pop(top,&x)==1)
		printf("执行一次出栈操作,删除元素:%d\n",x);
	if(GetTop(top,&x)==1)
		printf("当前栈顶元素为:%d\n",x);
	printf("请输入待插入元素:");
	scanf("%d",&x);
	Push(top,x);
	if(Empty(top)==1)
		printf("栈为空"); 
	else
		printf("栈非空");
	DestoryStack(top);
	return 0;
}
  • 9
    点赞
  • 82
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 创建一个的链,可以定义一个结构体来表示链的节点,包含一个数据域和一个指向下一个节点的指针。入操作可以在链的头部插入一个新节点,出操作可以删除的头部节点,返回元素可以直接返回链的头部节点的数据域。 具体实现如下: 1. 定义链节点的结构体: ``` typedef struct StackNode { int data; struct StackNode* next; } StackNode; ``` 2. 定义链的结构体,包含一个指向节点的指针: ``` typedef struct LinkStack { StackNode* top; } LinkStack; ``` 3. 创建一个的链: ``` LinkStack* createLinkStack() { LinkStack* stack = (LinkStack*)malloc(sizeof(LinkStack)); stack->top = NULL; return stack; } ``` 4. 实现操作: ``` void push(LinkStack* stack, int data) { StackNode* newNode = (StackNode*)malloc(sizeof(StackNode)); newNode->data = data; newNode->next = stack->top; stack->top = newNode; } ``` 5. 实现操作: ``` int pop(LinkStack* stack) { if (stack->top == NULL) { printf("Stack is empty.\n"); return -1; } int data = stack->top->data; StackNode* temp = stack->top; stack->top = stack->top->next; free(temp); return data; } ``` 6. 实现返回元素操作: ``` int getTop(LinkStack* stack) { if (stack->top == NULL) { printf("Stack is empty.\n"); return -1; } return stack->top->data; } ``` 以上就是创建一个的链实现的入、出、返回元素基本算法。 ### 回答2: 链是一种链式存储结构,它是以链表的形式来实现的存储和操作的。创建一个的链,需要定义一个结构体来表示链节点的数据结构,在C语言中可以使用struct来定义。 struct Node{ int data; struct Node* next; }; 链操作基本包括三个函数,分别是入(push)、出(pop)和返回元素(top)。 1. 入(push):在链插入一个新节点。方法是:创建一个新节点,将数据压入新节点,将新节点的指针指向节点,再将指针指向新节点。 void push(struct Node **top, int data){ struct Node *newNode = (struct Node*) malloc(sizeof(struct Node)); newNode->data = data; newNode->next = *top; *top = newNode; } 2. 出(pop):从链删除一个节点。方法是:保存节点的数据,将指针指向下一个节点,释放节点,并返回数据。 int pop(struct Node **top){ if(*top == NULL) return NULL; int data = (*top)->data; struct Node *temp = *top; *top = (*top)->next; free(temp); return data; } 3. 返回元素(top):返回链节点。方法是:返回节点的数据。 int top(struct Node **top){ if(*top == NULL) return NULL; return (*top)->data; } 完整代码如下: #include <stdio.h> #include <stdlib.h> struct Node{ int data; struct Node* next; }; void push(struct Node **top, int data){ struct Node *newNode = (struct Node*) malloc(sizeof(struct Node)); newNode->data = data; newNode->next = *top; *top = newNode; } int pop(struct Node **top){ if(*top == NULL) return NULL; int data = (*top)->data; struct Node *temp = *top; *top = (*top)->next; free(temp); return data; } int top(struct Node **top){ if(*top == NULL) return NULL; return (*top)->data; } int main(){ struct Node *top = NULL; push(&top, 1); push(&top, 2); push(&top, 3); printf("%d\n", top(&top)); // 输出3 printf("%d\n", pop(&top)); // 输出3 printf("%d\n", top(&top)); // 输出2 return 0; } ### 回答3: 链是一种基于链表实现。它和普通的结构一样,具有后进先出的特点,并且通过链表的形式可以动态地将数据存储在内存中。接下来,我们来创建一个的链,并实现基本操作。 - 创建的创建可以采用动态内存分配的方式,我们需要定义一个结构体节点,包含数据域和指向下一节点的指针域,用变量top来指示元素的位置。创建代码如下: ``` struct Node { int data; Node* next; }; Node *top = NULL; ``` - 的入的入是将数据插入链表头部,我们需要首先动态地创建一个新节点,将数据存入节点中,并将其指针域指向当前的元素,最后更新top指针的位置。入代码如下: ``` void push(int x) { Node* node = new Node; node->data = x; node->next = top; top = node; } ``` - 的出的出是从链表头部删除节点,并更新top指针的位置。我们需要首先判断链是否为,如果,则无法进行操作;如果不为,则我们需要将top指针指向下一个节点,并将当前节点删除。出代码如下: ``` void pop() { if (top == NULL) { cout<<",无法进行操作"<<endl; return; } Node *temp = top; top = top->next; delete temp; } ``` - 返回元素的top指针存储了当前元素的位置,我们可以通过top指针获元素的数值。我们需要首先判断链是否为,如果,则无法获元素;如果不为,则我们可以直接返回top节点的数值域。返回元素的代码如下: ``` int topElement() { if (top == NULL) { cout<<""<<endl; return -1; } return top->data; } ``` 至此,我们已经实现了链基本操作,包括创建、入、出、和返回元素。链与普通不同的是,它可以动态地存储数据,节省了静态内存间的开销。这些操作是链的基础,也是掌握链的关键。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值