当前位置:文档之家› 数据结构(C语言版)例题(第三章:栈和队列)

数据结构(C语言版)例题(第三章:栈和队列)

数据结构(C语言版)例题(第三章:栈和队列)(2008-05-09 12:33:13)转载▼◆3.15③假设以顺序存储结构实现一个双向栈,即在一维数组的存储空间中存在着两个栈,它们的栈底分别设在数组的的两个端点。

试编写实现这个双向栈tws的三个操作:初始化inistack(tws)、入栈push(tws,i,x)和出栈pop(tws,i,x)的算法, 其中i为0或1,用以分别指示设在数组两端的两个栈,并讨论按过程(正/误状态变量可设为变参)或函数设计这些操作算法各有什么优缺点。

实现下列3个函数:Status InitStack(TwoWayStack &tws, int size);Status Push(TwoWayStack &tws, int i, SElemType x);Status Pop(TwoWayStack &tws, int i, SElemType &x);双向栈类型定义如下:typedef struct {SElemType *elem;int top[2];int size; // 分配给elem的总容量}TwoWayStack; // 双端栈Status InitStack(TwoWayStack &tws, int size){tws.elem=(SElemType*)malloc(sizeof(SElemType)*size);tws.size=size;tws.top[0]=0; //haotws.top[1]=size-1; //以数组下标作为指针;return OK;}Status Push(TwoWayStack &tws, int i, SElemType x){int w=tws.top[0];if(w==tws.top[1]) return ERROR;else if(i==0){tws.elem[tws.top[0]]=x;tws.top[0]=tws.top[0]+1;}else if(i==1){tws.elem[tws.top[1]]=x;tws.top[1]=tws.top[1]-1;}return OK;}Status Pop(TwoWayStack &tws, int i, SElemType &x){ if(tws.top[1]==tws.size-1&&i==1) return ERROR;else if(tws.top[0]==0&&i==0) return ERROR;else if(i==0){tws.top[0]-=1;x=tws.elem[tws.top[0]];}else if(i==1){tws.top[1]+=1;x=tws.elem[tws.top[1]];}return x;}◆3.16②假设如题3.1所述火车调度站的入口处有n节硬席或软席车厢(分别以H和S表示)等待调度,试编写算法,输出对这n节车厢进行调度的操作(即入栈或出栈操作)序列,以使所有的软席车厢都被调整到硬席车厢之前。

实现下列函数:void SwitchYard(SqList train, char *s);顺序表类型定义如下:typedef struct {ElemType *elem;int length;int listsize;} SqList; // 顺序表void SwitchYard(SqList train, char *s){ int i,j=0,L;char *p;L=train.length;p=s;for(i=0;i<=L-1;i++){if(train.elem[i]=='H'){*(p++)='U';j++;}else{*p='U'; p++;*p='O'; p++;}}for(;j>0;j--){ *p='O';p++; }}◆3.19④假设一个算术表达式中可以包含三种括号:圆括号"(" 和")",方括号"["和"]"和花括号"{"和"}",且这三种括号可按任意的次序嵌套使用(如:…*…,…-…*…+…+…*…+…(…)…)。

编写判别给定表达式中所含括号是否正确配对出现的算法(已知表达式已存入数据元素为字符的顺序表中)。

实现下列函数:Status MatchCheck(SqList exp);顺序表类型定义如下:typedef struct {ElemType *elem;int length;int listsize;} SqList; // 顺序表Stack是一个已实现的栈。

可使用的相关类型和函数:typedef char SElemType; // 栈Stack的元素类型Status InitStack(Stack &s);Status Push(Stack &s, SElemType e);Status Pop(Stack &s, SElemType &e);Status StackEmpty(Stack s);Status GetTop(Stack s, SElemType &e);Status MatchCheck(SqList exp){ Stack s;char *p;SElemType c;InitStack(s);for(p=exp.elem;*p;p++){if(*p=='('||*p=='['||*p=='{') Push(s,*p);else if(*p==')'||*p==']'||*p=='}'){if(StackEmpty(s)) return FALSE;Pop(s,c);if(*p==')'&&c!='(') return FALSE;if(*p==']'&&c!='[') return FALSE;if(*p=='}'&&c!='{') return FALSE;}}if(!StackEmpty(s)) return FALSE;return TRUE;}◆3.20③假设以二维数组g(1..m,1..n)表示一个图像区域,g[i,j]表示该区域中点(i,j)所具颜色,其值为从0到k的整数。

编写算法置换点(i0,j0)所在区域的颜色。

约定和(i0,j0)同色的上、下、左、右的邻接点为同色区域的点。

实现下列函数:void ChangeColor(GTYPE g, int m, int n, char c, int i0, int j0);表示图像区域的类型定义如下:typedef char GTYPE[m+1][n+1];Stack是一个已实现的栈。

可使用的相关类型和函数:typedef int SElemType; // 栈Stack的元素类型Status StackInit(Stack &s, int initsize);Status Push(Stack &s, SElemType e);Status Pop(Stack &s, SElemType &e);Status StackEmpty(Stack s);Status GetTop(Stack s, SElemType &e);void ChangeColor(GTYPE g, int m, int n,char c, int i0, int j0) { int x,y,old;Stack s;old=g[i0][j0];StackInit(s,m*n*2);Push(s,i0);Push(s,j0);while(!StackEmpty(s)){Pop(s,y);Pop(s,x);if(x>1)if(g[x-1][y]==old){g[x-1][y]=c;Push(s,x-1);Push(s,y);}if(y>1)if(g[x][y-1]==old){g[x][y-1]=c;Push(s,x);Push(s,y-1);}if(xif(g[x+1][y]==old){g[x+1][y]=c;Push(s,x+1);Push(s,y);}if(yif(g[x][y+1]==old){g[x][y+1]=c;Push(s,x);Push(s,y+1);}}}◆3.21③假设表达式由单字母变量和双目四则运算算符构成。

试写一个算法,将一个通常书写形式且书写正确的表达式转换为逆波兰式。

实现下列函数:char *RPexpression_r(char *e);Stack是一个已实现的栈。

可使用的相关类型和函数:typedef char SElemType; // 栈Stack的元素类型Status InitStack(Stack &s);Status Push(Stack &s, SElemType e);Status Pop(Stack &s, SElemType &e);Status StackEmpty(Stack s);SElemType Top(Stack s);char *RPexpression_r(char *e){ static char b[20];char *a=b;char w3='k';char w;char w1,w2;Stack S;InitStack(S);while(*e!='\0'){switch(*e){case '+':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/'||w2=='+'||w2=='-') {Pop(S,w);*a=w;a++;}w2=Top(S);if(w2=='+'||w2=='-'){Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S))else Push(S,*e);e++;break;case '-':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/'||w2=='+'||w2=='-') {Pop(S,w);*a=w;a++;}w2=Top(S);if(w2=='+'||w2=='-'){Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S)) else Push(S,*e);e++;break;case '*':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/') {Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S)) else Push(S,*e);e++;break;case '/':if(!StackEmpty(S)){Pop(S,w2);Push(S,w2);if(w2=='*'||w2=='/') {Pop(S,w);*a=w;a++;}Push(S,*e);} //if(!StackEmpty(S)) else Push(S,*e);e++;break;case '(':Push(S,*e);break;case ')':while(w3!='('&&!StackEmpty(S)){Pop(S,w3);if(w3!='('){*a=w3;a++;}} //whilew3='k';e++;break;default:*a=*e;a++;e++;break;} //switch(*e)} //while(*e!='\0')while(!StackEmpty(S)){Pop(S,w);*a=w;a++;}*a='\0';return b;}◆3.24③试编写如下定义的递归函数的递归算法:g(m,n) = 0 当m=0,n>=0g(m,n) = g(m-1,2n)+n 当m>0,n>=0并根据算法画出求g(5,2)时栈的变化过程。

相关主题