前言
写本系列博文是为了本人考研方便复习,如果错误欢迎指正。
顺序栈的实现
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define Status bool
#define MAX 10
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define STACK_INIT_SIZE 20
typedef char ElemType;
typedef struct {
ElemType *base; // 栈底
ElemType *top; // 栈顶
int stacksize; // 当前分配的栈的存储空间数
}SqStack,* Stack;
Status InitStack(SqStack &s); // 初始化栈
Status Push(SqStack &s, ElemType e); // 入栈
Status Pop(SqStack &s); // 弹栈
Status Destroy(SqStack &s); // 销毁
Status InitStack(SqStack &s) {
s.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));
if (!s.base) {
exit(OVERFLOW);
}
s.top = s.base; // 直接对地址操作
// printf("%p ", s.base);
// printf("%p", s.top);
s.stacksize = STACK_INIT_SIZE;
return OK;
}
Status Push(SqStack &s, ElemType e) {
if ( s.top == s.base + s.stacksize) {
printf("抱歉栈溢出了!\n");
return ERROR;
}
*(s.top) = e; // top所指的空间给e
s.top ++; // 栈顶加1
return OK;
}
Status Pop(SqStack &s, ElemType &e) {
// 当栈顶等于栈底时该栈就空了
if ( s.top == s.base) {
printf("抱歉栈已经到底了!");
e = NULL;
return ERROR;
}
s.top --;
e = *(s.top);
return OK;
}
// 销毁
Status Destroy(SqStack &s) {
free(s.base);
return OK;
}
int main() {
ElemType e;
SqStack s;
InitStack(s);
char *str;
str = (char *)malloc(30 * sizeof(char));
printf("请输入一个字符串!:");
scanf("%s", str);
int len = strlen(str);
for (int i = 0; i < len; i++) {
Push(s, *(str + i));
}
for (int i = 0; i < len; i++) {
Pop(s, e);
printf("%c\n", e);
}
Destroy(s);
free(str);
return 0;
}
应用
括号匹配算法
// 括号匹配算法
void match() {
// char str[STRINGSIZE], e;
char *str, e;
str = (char *)malloc(STRINGSIZE * sizeof(char));
printf("请输入想要匹配的括号字符串:");
scanf("%s", str);
int len = strlen(str);
SqStack s;
InitStack(s);
/*
1.判断是左括号入栈
2.如果是右括号就出栈进行匹配
1)出栈匹配成功,继续读取下一个
2)匹配失败 括号匹配失败
3.如果栈空
1)右括号多余
2)匹配成功 代码遍历结束时
*/
// 字符串遍历
// for (int i = 0; i < len; i++) {
// str = str + i; 这种代码千万别写
// printf("%c\n" , *(str + i));
// }
for (int i = 0; i < len; i++) {
if ( str[i] == '{' || str[i] == '[' || str[i] == '(') {
Push(s, str[i]);
printf("入栈%c\n", str[i]);
} else {
// 如果读取的是有括号时
Pop(s, e);
printf("出栈%c\n", e);
if ( e == NULL) {
printf("右括号多余!");
Destroy(s);
free(str);
return;
}
switch (str[i]) {
case '}':
if ( e == '{') break;
case ']':
if ( e == '[') break;
case ')':
if ( e == '(') break;
default:
printf("括号匹配失败!");
Destroy(s);
free(str);
return;
}
}
}
Pop(s, e);
if (e == NULL) {
printf("匹配成功!");
} else {
printf("左括号多余!");
}
Destroy(s);
free(str);
return;
}
对顶栈
#include <stdio.h>
#include <stdlib.h>
typedef int SElemType;
int SIZE = 4;
typedef struct {
int top[2], bot[2]; // 栈顶和栈底指针
SElemType *V; // 栈数组
int m;
}DblStack;
void Dblpush(DblStack &s, SElemType x, int i); // 把x插入到栈i的栈
int Dbpop(DblStack &s, int i, SElemType &x); // 退掉位于栈i栈顶的元素
int IsEmpty(DblStack s, int i); // 判断栈i空否,空返回1,否则返回0
int IsFull(DblStack s); // 判断栈满否,满返回1,否则返回0
// 栈满
int IsFull(DblStack s) {
if (s.top[0] + 1 == s.top[1]) {
printf("该对顶栈已经满了!");
return 1;
} else {
return 0;
}
}
// 栈空
int IsEmpty(DblStack s, int i) {
if ( s.top[i] == s.bot[i] ) {
return 1;
} else {
return 0;
}
}
void Dblpush(DblStack &s, SElemType x, int i) {
// 判断对顶栈是否满了
if (IsFull(s)) {
return ;
} else {
if ( i == 0) {
s.top[0] ++;
*(s.V + s.top[0]) = x;
} else if( i == 1) {
s.top[1] --;
*(s.V + s.top[1]) = x;
}
}
}
// 退掉位于栈i栈顶的元素
int Dbpop(DblStack &s, int i, SElemType &x) {
// 判断栈是否为空
if (IsEmpty(s, i)) {
x = NULL;
return 0;
} else {
if (i == 0) {
x = *(s.V + s.top[0]);
s.top[0] --;
} else if (i == 1) {
x = *(s.V + s.top[1]);
s.top[1] ++;
}
}
}
// 对顶栈初始化
void DbInit(DblStack &s) {
s.m = SIZE;
s.V = (SElemType*)malloc((s.m - 1) * sizeof(SElemType));
if (s.V == NULL) {
printf("对顶栈初始化失败!");
exit(-1);
}
s.top[0] = -1;
s.top[1] = s.m;
s.bot[0] = -1;
s.bot[1] = s.m;
}
int main() {
int x;
DblStack s;
DbInit(s);
return 0;
}