标签:
数组或列表实现
编程中的括号匹配、四则运算
交互式程序中生产消费队列
问题:(1)栈什么时候为空?标记法
a、栈底存储特殊标记
b、记录栈底的位置
(2)栈溢出怎么办?
a、开辟固定空间,设置一个计数值,如果达到上限,就申请新空间。
b、链式的,入一个就开辟一个空间。(效率低)
更多的时候使用栈时是连续的空间,而不是链式。
场景分析:
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); }
语句:memset(head->ptr,‘\0‘,sizeof(node)*size);
操作对象:连续内存块
函数解释:将s中前n个字节 (typedef unsigned int size_t )用 ch 替换并返回 s 。
作用:在一段内存块中填充某个给定的值,它是对较大的结构体或数组进行清零操作的一种最快方法。
有问题可邮件378632668@qq.com,欢迎讨论!
标签:
原文地址:http://blog.csdn.net/wzwdcld/article/details/43876491