栈的定义
栈是限定仅在一段进行插入和删除操作的线性表。
我们把允许插入和删除的一端称为栈顶(top),另一端称为栈底(bottom),不含任何数据元素的栈称为空栈。栈又称为后进先出(Last In First Out)的线性表,简称LIFO结构。
栈的插入操作,叫作进栈,也称压栈、入栈。类似子弹入弹夹。
栈的删除操作,叫作出栈,也有的叫作弹栈。如同弹夹中的子弹出夹。
栈的抽象数据类型
头文件
#ifndef __STACK_H__
#define __STACK_H__#include<stdio.h>
#include<stdlib.h>typedef struct node
{int data;struct node *pnext;
}STACK_NODE; typedef struct list
{STACK_NODE *phead;int clen;
}STACK_LIST;extern STACK_LIST *CreatStackList();
extern int PushHeadSTACK(STACK_LIST *plist,int data);
extern int PopHeadSTACK(STACK_LIST *plist,int *data);
extern STACK_NODE *GetTopOfStack(STACK_LIST *plist);
extern int ClearStack(STACK_LIST *plist);
extern void DestoryStack(STACK_LIST *plist);
extern int ErgodicOfStack(STACK_LIST *plist);
extern int StackLength(STACK_LIST *plist);#endif
栈的初始化
初始化操作,建立一个空栈
STACK_LIST *CreatStackList()
{STACK_LIST *p = malloc(sizeof(STACK_LIST));p->phead = NULL;p->clen = 0;return p;
}
销毁
若栈存在,则销毁
void DestoryStack(STACK_LIST *plist)
{ClearStack(plist);free(plist);return ;
}
清空
将栈清空
int ClearStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){PopHeadSTACK(plist,NULL);p = plist->phead;}return 0;
}
判断栈是否为空
int IsEmptyStack(STACK_LIST *plist)
{return NULL == plist->phead;
}
进栈
若栈存在,插入新元素data到栈并成为栈顶元素
int PushHeadSTACK(STACK_LIST *plist,int data)
{STACK_NODE *p = malloc(sizeof(STACK_NODE));p->pnext = plist->phead;p->data = data;plist->phead = p;plist->clen++;return 0;
}
出栈
删除栈顶元素,并用data返回其值
int PopHeadSTACK(STACK_LIST *plist,int *data)
{if(IsEmptyStack(plist)){return -1;}STACK_NODE *p = plist->phead;plist->phead = p->pnext;if(data != NULL){*data = p->data;}free(p);plist->clen--;return 0;
}
获取栈顶元素
若栈存在且为空,返回栈顶并获取其指针
STACK_NODE *GetTopOfStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return NULL;}STACK_NODE *p = plist->phead;return p;
}
栈的长度
返回栈的元素个数
int StackLength(STACK_LIST *plist)
{return plist->clen;
}
遍历栈
int ErgodicOfStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){printf("%d ",p->data);p = p->pnext;}putchar('\n');return 0;
}
栈的应用
四则运算表达式求值
头文件
#ifndef __STACK_H__
#define __STACK_H__#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct node
{int data;struct node *pnext;
}STACK_NODE;typedef struct list
{STACK_NODE *phead;int clen;
}STACK_LIST;extern STACK_LIST *CreatStackList();
extern int PushHeadSTACK(STACK_LIST *plist,int data);
extern int PopHeadSTACK(STACK_LIST *plist,int *data);
extern int GetTopOfStack(STACK_LIST *plist,int *num);
extern int ClearStack(STACK_LIST *plist);
extern void DestoryStack(STACK_LIST *plist);
extern int ErgodicOfStack(STACK_LIST *plist);
extern int StackLength(STACK_LIST *plist);
extern int IsEmptyStack(STACK_LIST *plist);#endif
main.c
#include "stack.h"int IsNumChar(char ch)
{if(ch >= '0' && ch <= '9'){return 1;}return 0;
}int GetOptLevel(char opt)
{switch(opt){case '+':case '-':return 1;case '*':case '/':return 2;default:printf("opt error\n");exit(1);}
}int GetValue(int num1,int num2,int opt)
{switch(opt){case '+':return num1 + num2;case '-':return num1 - num2;case '*':return num1 * num2;case '/':return num1 / num2;}
}int main(void)
{char str[1024] = {0};STACK_LIST *pstacknum = CreatStackList();STACK_LIST *pstackopt = CreatStackList();if(NULL == pstacknum || NULL == pstackopt){return -1;}printf("Please enter four operations:");fgets(str,sizeof(str),stdin);str[strlen(str)-1] = '\0';char *p = str;int num = 0;int popOpt;int num1,num2,opt;while(1){if(*p == '\0' && IsEmptyStack(pstackopt)){break;}while(IsNumChar(*p)){num = num * 10 + (*p - '0') ;p++;if(!IsNumChar(*p)){PushHeadSTACK(pstacknum,num);num = 0;}}if(IsEmptyStack(pstackopt)){PushHeadSTACK(pstackopt,*p);p++;continue;}GetTopOfStack(pstackopt,&popOpt);if(*p != '\0' && GetOptLevel(*p) > GetOptLevel(popOpt)){PushHeadSTACK(pstackopt,*p);p++;}else{PopHeadSTACK(pstackopt,&opt);PopHeadSTACK(pstacknum,&num2);PopHeadSTACK(pstacknum,&num1);int res = GetValue(num1,num2,opt);PushHeadSTACK(pstacknum,res);}}ErgodicOfStack(pstacknum);DestoryStack(pstacknum);DestoryStack(pstackopt);return 0;
}
opera.c
#include "stack.h"STACK_LIST *CreatStackList()
{STACK_LIST *p = malloc(sizeof(STACK_LIST));p->phead = NULL;p->clen = 0;return p;
}int IsEmptyStack(STACK_LIST *plist)
{return NULL == plist->phead;
}int PushHeadSTACK(STACK_LIST *plist,int data)
{STACK_NODE *p = malloc(sizeof(STACK_NODE));p->pnext = plist->phead;p->data = data;plist->phead = p;plist->clen++;return 0;
}int PopHeadSTACK(STACK_LIST *plist,int *data)
{if(IsEmptyStack(plist)){return -1;}STACK_NODE *p = plist->phead;plist->phead = p->pnext;if(data != NULL){*data = p->data;}free(p);plist->clen--;return 0;
}int GetTopOfStack(STACK_LIST *plist,int *num)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;*num = p->data;return 0;
}int ClearStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){PopHeadSTACK(plist,NULL);p = plist->phead;}return 0;
}void DestoryStack(STACK_LIST *plist)
{ClearStack(plist);free(plist);return ;
}int StackLength(STACK_LIST *plist)
{return plist->clen;
}int ErgodicOfStack(STACK_LIST *plist)
{if(IsEmptyStack(plist)){return 0;}STACK_NODE *p = plist->phead;while(p){printf("%d ",p->data);p = p->pnext;}putchar('\n');return 0;
}
###结果:
以上就是今天内容!