栈是一种只允许在一端进行插入和删除的线性表,它是一种操作受限的线性表,在表中只允许进行插入和删除的一端称为栈顶,另一端称为栈底
顺序栈—栈的顺序存储结构
基本操作如下:
初始化栈(建立栈空间,初始化栈顶指针)判栈空(将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); }下载地址:http://blog.csdn.net/dear_mr/article/details/70156912