1、主题
2、学习视频和资料
3、实现
数组或列表实现
4、应用
栈
编程中的括号匹配、四则运算
队列
交互式程序中生产消费队列
5、知识体系
栈的基本操作
- 定义栈的元素
- 建立栈的信息:栈底、大小、栈顶标记
- 初始化栈的操作
- 销毁栈的操作
- 入栈操作(包括溢出判断,开辟新空间)
- 获取栈顶指针操作(出栈)
- 获取栈顶信息操作(出栈)
- 栈为空判断
用栈来检测表达式中的括号是否匹配
问题:(1)栈什么时候为空?标记法
a、栈底存储特殊标记
b、记录栈底的位置
(2)栈溢出怎么办?
a、开辟固定空间,设置一个计数值,如果达到上限,就申请新空间。
b、链式的,入一个就开辟一个空间。(效率低)
更多的时候使用栈时是连续的空间,而不是链式。
场景分析:
6、程序框架
typedef struct _member
{
char ch;//单元内容
int line;//行号
int column;//列号
}node,*pnode;
typedef struct _stack_ds //记录栈的信息
{
int size;//size of stack
int memb;//number of members
node ptr[0];//stack location 存放数据的位置
}stack_ds,*pstack_ds;
pstack_ds init_stack(int size)
{
pstack_ds head = (pstack_ds)malloc(sizeof(stack_ds) + sizeof(node)*size);
head->size = size;
head->memb = 0;
memset(head->ptr,'\0',sizeof(node)*size);
return head;
}
void destroy_stack(pstack_ds head)
{
free(head); //一次申请一次释放
}
void push_stack(pstack_ds head,char ch,int line,int column)
{
if (head->memb == head->size)
{
//realloc stack memory, to do
}
head->ptr[head->memb].ch = ch;
head->ptr[head->memb].line = line;
head->ptr[head->memb].column = column;
head->memb++;
}
pnode pop_stack(pstack_ds head)
{
if(head->memb == 0)
return null;
else
{
head->memb--;
return head.ptr + head->memb;
}
}
char fetch_top_memb(pstack_ds head)
{
if(head->memb == 0)
return -1;
else
return head->ptr[head->memb - 1].ch;
}
/*判断栈是否空*/
int empty_stack(pstack_ds head)
{
if (head->member <= 0)
{
return 1;
}
else
return 0;
}
int main(int argc,char *argv[])
{
if(argc < 2)
{
printf("pls usage %s filename\n",argv[0] );
exit(EXIT_FAILURE);
}
FILE *fp = fopen(argv[1],"r");
if (fp == NULL)
{
perror("fopen");
exit(EXIT_FAILURE);
}
fclose(fp);
}
补充
void *memset(void *s, int ch, size_t n) 函数
语句:memset(head->ptr,‘\0‘,sizeof(node)*size);
操作对象:连续内存块
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
7、后记
有问题可邮件[email protected],欢迎讨论!
时间: 2024-12-19 23:24:35