数据结构之栈的实现
程序员文章站
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;
}