欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

数据结构之栈的实现

程序员文章站 2024-02-29 08:24:34
...

定义

栈是限制插入和删除只能在一个位置的上进行的表(→叫做后进先出表),该位置是表的末端,叫做栈顶。对栈的基本操作是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;
}