由于一直练习的是类-方法型的算法题,但许多笔试都是cin/cout型题,这个文档即针对链表的Cin/cout 做一个举例。
首先,了解一下成员函数 cin.get(): ('\n'为回车)
与字符串输入一样,有时候使用 cin>> 读取字符也不会按我们想要的结果行事。
例如,因为它会忽略掉所有前导白色空格,所以使用 cin>> 就不可能仅输入一个空格或回车符。除非用户输入了空格键、制表符之外的其他字符,否则程序将不可能通过 cin 语句继续执行(一旦输入了这样的字符,在程序可以继续下一个语句之前,仍然需要按回车键)。因此,要求用户“按回车键继续”的程序,不能使用 >> 运算符只读取按回车键的行为。
在这些情况下,cin 对象有一个名为 get 的内置函数很有帮助。因为 get 函数是内置在 cin 对象中的,所以可称之为 cin 的一个成员函数。get 成员函数读取单个字符,包括任何白色空格字符。如果程序需要存储正在读取的字符,则可以通过以下任意一种方式调用 get 成员函数。
以链表反转的算法为例(我用stack的容器做)
上代码:
#include <iostream>
using namespace std;
#include <string>
#include <stack>
struct ListNode {
int val;
ListNode *next;
ListNode(int x) : val(x), next(NULL) {}
};
ListNode* reverse(ListNode* head) {
stack<ListNode*> res;
while (head) {
res.push(head);
head = head->next;
}
ListNode*p = new ListNode(-1);
head = p;
while (!res.empty()) {
p->next = res.top();
res.pop();
p = p->next;
}
p->next = NULL;
return head->next;
}
void printList(ListNode* p) {
while (p) {
cout << p->val<< "---";
p = p->next;
}
cout << endl;
}
int main() {
ListNode* head = new ListNode(-1);
ListNode* temp = head;
int x=1;
int cycle = 1;
char end_id;
while (cycle) {
cin >> x;
ListNode*s = new ListNode(x);
temp -> next = s;
temp = temp->next;
if (cin.get() == '\n')
break;
}
head = head -> next;
printList(head);
head = reverse(head);
printList(head);
system("pause");
return 1;
}
测试结果图(为了直观,调用了printList函数进行打印):