数据结构之栈的实现

定义

栈是限制插入和删除只能在一个位置的上进行的表(→叫做后进先出表),该位置是表的末端,叫做栈顶。对栈的基本操作是push(入栈)和pop(出栈),前者是插入元素到栈顶,后者是将栈顶元素删除



栈的应用
1.平衡符号:编译器检查程序的语法错误,看看一些符号是否匹配如“([])”是匹配的,而“[(])”是不匹配的
2.计算后缀表达式:在输入表达式过程中,遇到操作数就入栈,遇到操作符就从栈中弹出两个操作数进行运算,然后将结果压入     栈中,当输入完成后,栈顶即使计算结果
3.中缀表达式转后缀表达:这个涉及运算符的优先级,通过一系列进栈出栈,完成转换
4.函数调用:函数调用的内部实现就是通过栈来完成的

栈的实现
由于栈是一个表,所以实现表的方法都可以用于实现栈,一种是数组,一种是链表,使用数组需要提前声明一个已知大小的数组,如果声明过大,会造成空间的浪费,所以节省的做法是使用链表

下面是栈的链表实现,我们让表的前端作为栈顶

头文件stack.h

struct Node;

typedef struct Node	*ptrToNode;
typedef struct Node	*Stack;
typedef int Element;

//创建栈
ptrToNode createStack();
//判断栈是否为空
int isEmpty(Stack S);
//出栈
void pop(Stack S);
//入栈
void push(Stack S,Element e);
//清空栈
void makeEmpty(Stack S);
//返回栈顶元素
Element top(Stack S);
//销毁栈
void destoryStack(Stack &S);

具体实现

#include<stdio.h>
#include<stdlib.h>
#include "stack.h"

struct Node{
	Element data;
	ptrToNode next;
};

//创建栈
Stack createStack(){
	Stack S = (Stack)malloc(sizeof(struct Node));
	if(S == NULL){
		printf("failed to createStack\n");
		return NULL;
	}
	S->next=NULL;
	return S;
}

//判断栈是否为空
int isEmpty(Stack S){
	return S->next == NULL;
}

//出栈
void pop(Stack S){
	if(S == NULL){
		printf("please create stack\n");
		return;
	}
	if(!isEmpty(S)){
		ptrToNode ptr = S->next;
		S->next = ptr->next;
		free(ptr);
	}
	else{
		printf("the stack is empty");
	}
}

//入栈
void push(Stack S,Element e){
	if(S!=NULL){
		ptrToNode ptr = (ptrToNode)malloc(sizeof(struct Node));
		ptr->data = e;
		ptr->next = S->next;
		S->next = ptr;
	}
	else{
		printf("please create stack\n");
	}
}

//清空栈
void makeEmpty(Stack S){
	ptrToNode ptr;
	if(S==NULL){
		printf("please creatr stack\n");
		return;
	}
	while(S->next!=NULL){
		ptr = S->next;
		S->next = ptr->next;
		free(ptr);
	}
}

//返回栈顶元素
Element top(Stack S){
	if(S == NULL){
		printf("please create stack\n");
		return NULL;
	}
	if(!isEmpty(S))
		return S->next->data;
	printf("the stack is empty\n");
	return 0;
}

//销毁栈
void destoryStack(Stack &S){
	if(S != NULL){
		makeEmpty(S);
		ptrToNode ptr = S;
		free(ptr);
		S = NULL;
	}
}

测试

#include <stdio.h>
#include "stack.h"

int main(){
	Stack S = createStack();
	push(S,1);
	push(S,2);
	push(S,3);
	push(S,4);
	push(S,5);
	
	for(int i=0;i<5;i++){
		printf("%d ",top(S));
		pop(S);
	}
	
	destoryStack(S);
	return 0;
}


  • 15
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值