图解 C语言实现数据结构 栈

#define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 typedef struct { SElemType *base; // 栈底指针（始终指向栈底） SElemType *top; // 栈顶指针 int stacksize; // 当前栈的最大容量 } SqStack;

1. 初始化栈

Status initStack(SqStack *S) { S.base = (SElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); if(!S.base) return ERROR; S.top = S.base; S.stacksize = STACK_INIT_SIZE; return OK; }

2. 栈判空

Status stackEmpty(SqStack* S) { return S.top == S.base; }

3. 判栈满

Status stackFull(SqStack* S) { return ((S.top - S.base) == S.stacksize); }

4. 读取栈顶元素

Status getTop(SqStack* S, ElemType e) {//返回栈S的栈顶元素,但栈顶指针保持不变 if(S.top == S.base) //栈为空 {printf("Stack is empty!"); return ERROR; } e = *(S.top-1); return OK; }

5. 入栈

Status push(SqStack* S, SElemType e) { if(S.top-S.base >= S.stacksize) //判满 { //追加存储空间 S.base = (ElemType*)realloc(S.base(S.stacksize+STACKINCREMENT)*sizeof(ElemType)); if(!S.base) exit(OVERFLOW); //上溢 S.top = S.base+S.stacksize; S.stacksize += STACKINCREMENT; } *S.top++ = e; //栈顶指针后移，赋值 return OK; }

6. 出栈

Status pop(SqStack* S, SElemType *e) { //将栈S的栈顶元素弹出并返回 if(S.top == S.base) { printf("Stack is empty!"); return ERROR; } e = s->top; s->top--; return OK; }

typedef struct SNode { SElemType data; struct SNode *next; }SNode, *LinkStack

1. 初始化栈

2. 进栈

Status push(LinkStack* top, SElemType e) { LinkStack* q; q = (LinkStack*)malloc(sizeof(SNode)); if (!q) exit(OVERFLOW); //存储分配失败 q->data = e; q->next = top->next; top->next = q; return OK; }

3. 出栈

Status pop(LinkStack* top, SElemType e) { LinkStack* q; if (!top->next) return ERROR; e = top->next->data; //取出栈顶元素的值 q = top->next; //q指向栈顶元素 top->next = q->next; //删除栈顶元素 free (q); //释放栈顶元素所占的空间 return OK; }

4.取栈顶元素

Status getTop(LinkStack* top, SElemType e) { if (!top->next) return ERROR; else { e = top->next->data; return OK; } }

1) 首先置操作数栈OPND为空栈，表达式的起始符#为运算符栈OPTR的栈底元素；

2) 依次读入表达式中的每个字符，若运算符是 “#” 且栈顶是 “#”，结束计算，返回OPND栈顶值。如果是操作数，则push(OPND，操作数)，如果是运算符，则与OPTR栈顶元素进行比较，按优先级进行操作。

OperandType eval() { initstack(&OPTR); //初始化OPTR栈 push(&OPTR, '#'); initstack(&OPND); c = getchar(); while (c != '#') || getTop(OPTR) != '#') { if (!in(c,op)) //如果c是操作数 { push(&OPND); c = getchar(); } else //c是一个运算符 { r=precede(getTop(OPTR), c); // 比较两个运算符的优先级 switch(r) { case '': //退栈并将运算结果入栈 pop(&OPTR,&op); pop(&OPND,&b); pop(&OPND,&a); value=operate(a, op, b) ; push(&OPND, value); break; } } } return(getTop(OPND)); }

• 广告
• 抄袭
• 版权
• 政治
• 色情
• 无意义
• 其他

120