算法设计题之 二

leobertt 2009-11-13 01:11:25
1. 假设算术表达式中只有圆括号,请设计一个算法 int match(char *exp, int &pos),利用栈
判断一个算术表达式exp(用字符串表示)中的圆括号是否匹配。若匹配,函数返回1,
否则,函数返回0。

2. 已知一个带有表头结点的单链表的结点结构为 |data|link |.假设该链表只给出了头
指针list。在不改变链表的前提下,请设计一个尽可能高效的算法,查找链表中倒数第
k 个位置上的结点(k 为正整数)。若查找成功,算法输出该结点的data 域的值,并返
回1;否则,只返回0。
...全文
221 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lwjvive 2009-11-14
  • 打赏
  • 举报
回复
学习
oyzdz1988 2009-11-14
  • 打赏
  • 举报
回复
顶,楼上正解~
hua_zhixing_ 2009-11-14
  • 打赏
  • 举报
回复
1、设个n就可以了啦,遇到"("加1,遇到")"减1,最后n=0就返回1,否则返回0;
2、设两个指针f、b,结点计数n,f与b的相距n=k个结点,当f->link=NULL时,输出b->data即可;其它情况下该干嘛就干嘛去。
嘎文 2009-11-13
  • 打赏
  • 举报
回复
来分哦,呵呵
嘎文 2009-11-13
  • 打赏
  • 举报
回复
第一个的话,STL里面提供了stack可以解决,具体代码就不写了,遍历exp数组,遇到左括号( 就压栈,遇到右括号) 就弹栈,字符串结束时,如果栈空,表明括号是匹配的,当然至于表达式是否合法这样是无法确定的。
第二个这样做,我先假设data是整形的,其他的话你可以用模板做:
//时间复杂度是O(n),空间复杂度是O(1)
//相关头文件自己加上
int find(struct node * head,int n) //struct node 是节点类型
{
struct *p=head->next, *q=head;
int pos=0;
while(q && pos<n)
{
q=q->next;
pos++;
} //使p,q之间距离为n
if(pos<n)
{
cerr << "链表长度小于N\n";
exit(-1);
}
while(q->next)
{
p=p->next;
q=q->next;
}//p,q同时向后推进
return p->data;
}
fenix124 2009-11-13
  • 打赏
  • 举报
回复
1用栈,右括号则检查栈顶,相同则出栈,否则错误;左括号进栈.最后检查栈是否为空.
2如果链表大小不变,则另开个数组存链表数据.每次取的时间复杂度为O(1).

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧