10.1-2 在一個數組A[1..n]中實現兩個棧,使得兩個棧元素個數之和不爲n時,兩者不會上溢

/*在一個數組A[1..n]中實現兩個棧,使得兩個棧
元素個數之和不爲n時,兩者不會上溢*/
#include<stdio.h>
#define n 6
typedef char ElemType;
typedef int bool;
ElemType A[n];
int top1=1;//棧1的棧頂指針
int top2=n;//棧2的棧頂指針
//永遠都指向棧頂元素的下一個位置
/*
棧1的棧底是A[1],元素進棧放入的位置順序是1,2,3,...(下標)
棧2的棧底A[n],元素進棧放入的位置順序是n,n-1,n-2,...
*/
void warning(char* s)
{
    puts(s);
}
bool full()//兩個棧之和是否滿
{
    return top2+1==top1;
}
void push1(ElemType elem)//push到stack1
{
    if(full()) warning("stack overflow!");
    else{ A[top1]=elem;top1++; }
}
void push2(ElemType elem)//push到stack2
{
    if(full()) warning("stack overflow!");
    else{ A[top2]=elem;top2--; }
}
bool empty1()//stack1是否empty
{
    return top1==1;
}
bool empty2()//stack2是否empty
{
    return top2==n;
}
ElemType tops1()//stack1的棧頂元素
{
    return A[top1-1];
}
ElemType tops2()//stack2的棧頂元素
{
    return A[top2+1];
}
void pop1()//stack1的pop
{
    if(empty1()) warning("stack underflow!");
    else top1--;
}
void pop2()//stack2的pop
{
    if(empty2()) warning("stack underflow!");
    else top2++;
}
void traverse()
{
    int i;
    for(i=1;i<top1;i++)
        putchar(A[i]);
    putchar(' ');
    for(i=n;i>top2;i--)
        putchar(A[i]);
    putchar('\n');
}
int main(void)
{
    traverse();
    pop1();
    push1('a');
    putchar(tops1());putchar('\n');
    push1('b');
    push1('c');
    push1('d');
    pop1();
    traverse();
    putchar(tops1());putchar('\n');
    pop2();
    push2('z');
    push2('y');
    push2('x');
    push2('w');
    traverse();
    pop2();pop2();pop2();pop2();pop1();
    traverse();
    push1('b');push1('b');push1('b');push1('b');
    traverse();
    return 0;
}

發佈了47 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章