#include <stdio.h>
#include <stdlib.h>
#define STACK_INIT_SIZE 20
#define STACKINCREMENT 10
5:
/*将char类型定义为ElemType*/
/*定义一个栈类型*/
8: ElemType *base;
9: ElemType *top;
int stacksize;
11: } sqStack;
12:
13:
void initStack(sqStack *s)
15: {
/*内存中开辟一段连续空间作为栈空间,首地址赋值给s->base*/
sizeof(ElemType));
18:
/*分配空间失败*/
20:
/*最开始,栈顶就是栈底*/
/*最大容量为STACK_INIT_SIZE */
23: }
24:
/*入栈操作*/
if(s->top - s->base >= s->stacksize) {
/*栈满,追加空间*/
28: s->base = (ElemType *)realloc(s->base, (s->stacksize +
sizeof(ElemType));
30:
/*存储分配失败*/
32:
33: s->top = s->base + s->stacksize;
/*设置栈的最大容量*/
35: }
36:
/*放入数据*/
38: s->top++;
39: }
40:
/*出栈操作*/
/*将栈顶元素弹出*/
43:
/*修改栈顶指针*/
45: }
46:
/*获得栈s的大小*/
return (s.top - s.base) ;
49: }
50:
51:
void translate(ElemType e, sqStack *s) {
53: ElemType c , a;
54: sqStack ss1;
55:
, e);
);
);
'(')
60: {
61:
/*初始化栈ss1,用来将括号里面的内容从栈中取出*/
/*注意*s相当于主函数中的s*/
/*保留括号后的第一个元素*/
65: Pop(&(*s), &c);
66:
')') {
68: Push(&ss1, a);
69: Push(&ss1, c);
70: Pop(&(*s), &c);
71: }
72:
/*并按语法规定排列后从右至左进入一个新栈ss1*/
74:
/*翻译括号里的内容*/
76: {
/*取出ss1中的元素c*/
/*递归地调用函数 translate对元素c进行翻译*/
79: }
80: }
81: }
82:
int main()
84: {
85: ElemType e;
86: sqStack s1, s2;
/*初始化栈s1*/
88:
);
, &e);
91:
'#')
93: {
')')
/*输入的魔王语言合法*/
/*入栈*/
97:
98: }
99:
, &e);
101: }
102:
103:
/*初始化栈s2*/
105:
while(StackLen(s1))
107: {
108: Pop(&s1, &e);
/*将魔王语言从右至左入栈s2*/
111: }
112:
);
114:
while(StackLen(s2))
116: {
117: Pop(&s2, &e);
118: translate(e, &s2) ;
119: }
120:
return 0;
122:
123: }