线性结构之栈
栈是一种只允许在一端进行插入和删除的线性表,它是一种操作受限的线性表,在表中只允许进行插入和删除的一端称为栈顶,另一端称为栈底
顺序栈—栈的顺序存储结构
基本操作如下:
- 初始化栈(建立栈空间,初始化栈顶指针)
- 判栈空(将top值与-1进行比较,相等则说明栈空)
- 判栈满(将top值与MAXSIZE-1进行比较,想等说明栈满)
- 入栈(在栈未满的情况下,进行入栈操作)
- 出栈(在栈未空的情况下,进行出栈操作)
- 取栈顶元素
关于栈的代码如下:
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
typedef int dataType;
typedef struct SeqStack {
dataType data[MAXSIZE];
int top;
}SeqStack;
int initSeq(SeqStack **s); //初始化栈(建立占空间,初始化栈顶指针)
int isEmpty(int top); //判栈空
int isFull(int top); //判栈满
int push(SeqStack *s, dataType data); //入栈
dataType pop(SeqStack *s); //出栈
dataType peek(SeqStack *s); //取栈顶元素
dataType peek(SeqStack *s) {
return s->data[s->top];
}
dataType pop(SeqStack *s) {
if(isEmpty(s->top)) {
printf("栈空,无法出栈.\n");
return FALSE;
}
return s->data[s->top--];
}
int push(SeqStack *s, dataType data){
if(isFull(s->top)) {
printf("栈已满,无法入栈.\n");
return FALSE;
}
s->data[++s->top] = data;
return TRUE;
}
int isFull(int top) {
return top == MAXSIZE-1 ? TRUE : FALSE;
}
int isEmpty(int top) {
return top == -1 ? TRUE : FALSE;
}
int initSeq(SeqStack **s) {
if(*s != NULL) {
printf("警告: 该栈已经完成初始化了.\n");
return FALSE;
}
(*s) = (SeqStack *)malloc(sizeof(SeqStack) * 1);
(*s)->top = -1;
return TRUE;
}
void main(void) {
SeqStack *s = NULL;
int i = 0;
initSeq(&s);
for(; i < 5; i++) {
push(s, i);
}
for(i = 0; i < 5; i++) {
printf("%d ", pop(s));
}
}
栈的一个重要应用就是在程序设计语言中实现递归过程,下面看一个汉诺塔的问题
假设有三个分别命名为A,B,C的塔盘,在塔盘A上有n个直径大小各不相同的盘子,依次从小到大编号为1,2,……,n的原盘,现要求将A轴上的n个盘子移至C上并按照相同的顺序进行排列,移动过程中需要满足:
(1) 每次只能移动一个原盘
(2)原盘可以插在A,B,C中的任一塔座上
(3)任何时刻都不能将一个较大的原盘压在较小的原盘之上
思路: 将n个盘子分成两部分,第一部分是n-1,第二部分只有1个,只需要将第一部分的盘子从A借助C移动到B,第二部分从A直接移动到C
具体代码如下:
#include<stdio.h>
int i = 0;
void hanoi(int n, char from, char depend_on, char to);
void move(int n, char from, char to);
void move(int n, char from, char to) {
printf("第%d步: 将%d号盘子 %c----->%c\n", i++, n, from, to);
}
void hanoi(int n, char from, char depend_on, char to) {
if(n == 1) {
move(1, from, to);
}else {
hanoi(n-1, from, to, depend_on);
move(n, from, to);
hanoi(n-1, depend_on, from, to);
}
}
void main(void) {
int n;
char from = 'A', to = 'C', depend_to = 'B';
printf("请输入盘子数目: \n");
scanf("%d", &n);
printf("盘子移动情况如下: \n");
hanoi(n, from, depend_to, to);
}