栈的定义:栈是仅限在表尾进行插入和删除的线性表允许进行插入和删除的一端被称为栈顶另一端被称为栈底,插入被称为进栈或入栈,删除被称为出栈或退栈。
栈的特点:先进后出
栈的基本算法:
1.进栈
①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);
②置TOP=TOP+1(栈指针加1,指向进栈地址);
③S(TOP)=X,结束(X为新进栈的元素);
2.退栈
①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);
②X=S(TOP),(退栈后的元素赋给X):
③TOP=TOP-1,结束(栈指针减1,指向栈顶)。
栈的分类:栈分顺序栈和链式栈
顺序栈的实现
代码如下:
head.h部分
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
#define maxsize 30
typedef struct node
{
int * base;
int * top;
int stacksize;
}Sqstack;
void InitStack(Sqstack *S);
void Push(Sqstack *S,int elem);
int Pop(Sqstack *S);
operation.c部分:
#include"head.h"
void InitStack(Sqstack *S) //初始化栈
{
S->base = (int *)malloc(sizeof(int)*maxsize);//给栈分配数组空间
if(!S->base)
exit(0);
S->top=S->base;
S->stacksize=maxsize;
}
void Push(Sqstack *S,int elem)//入栈
{
*S->top++=elem; //元素先入栈,指针后加一
}
int Pop(Sqstack *S)
{
int elem ;
elem=*--S->top; //栈顶指针先减一,再将栈顶元素出栈
return elem;
}
//这里使用指针来返回函数值更为方便
/*void Pop(Sqstack *S,int*elem)
{
*elem=*--S->top; //栈顶指针先减一,再将栈顶元素出栈
}
*/
main.c
#include"head.h"
int main()
{
Sqstack S;
int d,i,a,b;
InitStack(&S);
printf("请输入一个数:\n");
scanf("%d",&d);
while(!a==0)
{
a=d/2;
b=d-a*2; //取余数确定栈底元素
d=a;
Push(&S,b); //元素入栈
}
printf("转化为二进制为:\n");
while(S.top!=S.base)
{
i= Pop(&S); /*Pop(&S,&i)*/
printf("%d",i);
}
printf("\n");
}
链栈代码:
head.h
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
#define ERROR -1
//定义数据结点类型
typedef struct Node{
int data;
struct Node*next;
} LNode,*LinkStack;
int push(LinkStack S,int element);
int pop(LinkStack S);
operation.c
#include"head.h"
int push(LinkStack S,int element){
LNode *p;
p= (LNode*)malloc(sizeof(LNode));
p->data=element;
p->next=S->next;
S->next=p;
return element;
}
int pop(LinkStack S){
int e;
LinkStack p;
p=S->next;
if (S==NULL) return ERROR;
e=p->data; //栈顶元素赋给e
S->next=p->next; //栈顶指针下移
free(p);
return e;
}
main函数
#include"head.h"
int main()
{
LinkStack S;
S= (LNode*)malloc(sizeof(LNode));
S->next = NULL;
int i,k,a,f,h,j;
printf( "输入入栈元素个数:\n" );
scanf("%d",&k);
for ( i = 0; i < k; i++)
{
printf("请输入元素:\n");
scanf("%d",&a);
push(S,a);
}
printf( "--------------------\n" );
printf("输入出栈元素个数:\n" );
scanf("%d",&f);
printf("元素出栈\n");
for ( h= 0; h< f; h++)
{
j=pop(S);
printf("%d",j);
}
printf("\n");
return 0;
}