直接操作栈数据 Stack st;/定义栈数据 st.top=-1;//对st进行初始化 /把12放进栈 if(st.top =STACK_SIZE-1) cout <"Stack is overflow.\n";exit(-1); st.top++;st.buffer[st.top]12; /把栈顶元素退栈并存入变量x if (st.top ==-1) cout <"Stack is empty.\n";exit(-1); int x st.buffer[st.top];st.top--;
◼ 直接操作栈数据 Stack st; //定义栈数据 st.top = -1; //对st进行初始化 //把12放进栈 if (st.top == STACK_SIZE-1) { cout << “Stack is overflow.\n”; exit(-1); } st.top++; st.buffer[st.top] = 12; ...... //把栈顶元素退栈并存入变量x if (st.top == -1) { cout << “Stack is empty.\n”; exit(-1); } int x = st.buffer[st.top]; st.top--;
。存在的问题 操作必需知道数据的表示,数据表示发生变化将影 响操作 ■麻烦并易产生误操作,因此不安全。例如,对于进 栈操作: st.top-;/书写失误导致误操作 st.buffer[st.top]12; 忘了初始化:st.top=-1;
• 存在的问题 ◼ 操作必需知道数据的表示,数据表示发生变化将影 响操作。 ◼ 麻烦并易产生误操作,因此不安全。例如,对于进 栈操作: st.top--; //书写失误导致误操作 st.buffer[st.top] = 12; ◼ 忘了初始化: st.top = -1;
·通过过程抽象使用栈数据 。先预定义三个函数 void push(Stack &s,int i) if (s.top =STACK_SIZE-1) {cout<<“Stack is overflow.n”; exit(-1)月 else {s.top++;s.buffer[s.top]i; return; void init(Stack &s) } s.top =-1; void pop(Stack &s,int &i) if (s.top ==-1) {cout<<“Stack is empty.n”y exit(-1); else i s.buffer[s.top];s.top--; return;
◼ 通过过程抽象使用栈数据 • 先预定义三个函数 void push(Stack &s, int i) { if (s.top == STACK_SIZE-1) {cout << “Stack is overflow.\n”; exit(-1); } else {s.top++; s.buffer[s.top] = i; return; } } void pop(Stack &s, int &i) { if (s.top == -1) {cout <<“Stack is empty.\n”; exit(-1); } else { i = s.buffer[s.top]; s.top--; return; } } void init(Stack &s) { s.top = -1; }
·利用预定义的函数使用栈 Stack st;/定义栈数据 int x; init(st);/对st进行初始化。 push(st,12);/把12放进栈。 11nn·0 pop(st,x);/把栈顶元素退栈并存入变量x
• 利用预定义的函数使用栈 Stack st; //定义栈数据 int x; init(st); //对st进行初始化。 push(st,12); //把12放进栈。 ...... pop(st,x); //把栈顶元素退栈并存入变量x
。存在的问题 数据类型的定义与操作的定义是分开的,二者之间 没有显式的联系,push、pop在形式上与下面的函 数f没有区别,函数f也能作用于st: void f(Stack &s){......} f(st);/操作st之后,st可能不再是一个“栈”了! ·数据表示仍然是公开的,无法防止使用者直接操作 栈数据,因此也会面临直接操作栈数据所带来的问 题: st.top--; st.buffer[st.top]12; 忘了初始化:init(st);
• 存在的问题 ◼ 数据类型的定义与操作的定义是分开的,二者之间 没有显式的联系,push、pop在形式上与下面的函 数f没有区别,函数f也能作用于st: void f(Stack &s) { ...... } f(st); //操作st之后,st可能不再是一个“栈”了! ◼ 数据表示仍然是公开的,无法防止使用者直接操作 栈数据,因此也会面临直接操作栈数据所带来的问 题: st.top--; st.buffer[st.top] = 12; ◼ 忘了初始化:init(st);