小结:
一、栈的基本定义:是限定仅在表尾进行插入或删除操作的线性表。也叫做后进先出的线性表。
二、栈的表示和实现:
1.顺序栈:利用一组地址连续的存储单元依次存放自栈底到栈顶的元素。
2.链栈:链栈是没有附加头结点的运算受限的单链表。栈顶指针就是链表的头指针。
三、栈的应用举例:
1.数制转换
2.括号匹配的检验(2015年考研真题)
3.行编辑程序
4.栈与递归
5.表达式求值
栈的基本操作实现:
栈的结构定义:
typedef struct { int * base; int * top; int stacksize; }SqStack;
初始化:
void InitStack(SqStack * s) { s->base = (int *)malloc(STACK_INIT_SIZE*sizeof(int)); s->top = s->base; s->stacksize = STACK_INIT_SIZE; }
进栈:
void Push(SqStack *s, int e) { if (s->top - s->base >= s->stacksize) { s->base = (int *)realloc(s->base, (s->stacksize + STACKINCREMENT)*sizeof(int)); s->top = s->base + s->stacksize; s->stacksize += STACKINCREMENT; } *s->top = e; s->top++; }
出栈:
int Pop(SqStack *s) { int i; if (s->top == s->base) return 0; s->top--; i = *s->top; return i; }
打印函数:
void Print(SqStack *s) { int * temp; temp = s->top; while (temp != s->base) { temp--; printf("%d ", *temp); } }
主函数:
int main() { SqStack S; InitStack(&S); int num; for (int i = 1; i <= 6; i++) { scanf("%d", &num); Push(&S, num); } printf("打印栈里的元素:"); Print(&S); printf("\n"); int n = Pop(&S); printf("出栈的元素为:%d\n", n); }
运行结果: